diff --git a/.github/workflows/build-on-ubuntu.yml b/.github/workflows/build-on-ubuntu.yml
index 028e583..f8c2493 100644
--- a/.github/workflows/build-on-ubuntu.yml
+++ b/.github/workflows/build-on-ubuntu.yml
@@ -14,7 +14,7 @@ jobs:
- uses: actions/setup-java@v4
with:
- java-version: 11
+ java-version: 17
distribution: zulu
cache: gradle
diff --git a/.github/workflows/build-on-windows.yml b/.github/workflows/build-on-windows.yml
index 3627bbf..4e6b57f 100644
--- a/.github/workflows/build-on-windows.yml
+++ b/.github/workflows/build-on-windows.yml
@@ -14,7 +14,7 @@ jobs:
- uses: actions/setup-java@v4
with:
- java-version: 11
+ java-version: 17
distribution: zulu
cache: gradle
diff --git a/.github/workflows/gradle-wrapper-validation.yml b/.github/workflows/gradle-wrapper-validation.yml
index b2955de..858cebb 100644
--- a/.github/workflows/gradle-wrapper-validation.yml
+++ b/.github/workflows/gradle-wrapper-validation.yml
@@ -9,7 +9,7 @@ on:
jobs:
validation:
- name: Validation
+ name: Gradle Wrapper Validation
runs-on: ubuntu-latest
steps:
- name: Checkout latest code
diff --git a/.github/workflows/increment-guard.yml b/.github/workflows/increment-guard.yml
index a1c90c3..1993841 100644
--- a/.github/workflows/increment-guard.yml
+++ b/.github/workflows/increment-guard.yml
@@ -20,7 +20,7 @@ jobs:
- uses: actions/setup-java@v4
with:
- java-version: 11
+ java-version: 17
distribution: zulu
cache: gradle
diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml
index 73a0a69..8b5b4d5 100644
--- a/.github/workflows/publish.yml
+++ b/.github/workflows/publish.yml
@@ -14,7 +14,7 @@ jobs:
- uses: actions/setup-java@v4
with:
- java-version: 11
+ java-version: 17
distribution: zulu
cache: gradle
diff --git a/.gitignore b/.gitignore
index 11aaccc..df543ce 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,11 +1,11 @@
#
-# Copyright 2024, TeamDev. All rights reserved.
+# 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
#
-# http://www.apache.org/licenses/LICENSE-2.0
+# 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
@@ -31,6 +31,15 @@
#
# Therefore, instructions below are superset of instructions required for all the projects.
+# `jenv` local configuration.
+.java-version
+
+# Internal tool directories.
+.fleet/
+
+# Kotlin temp directories.
+**/.kotlin/
+
# IntelliJ IDEA modules and interim config files.
*.iml
.idea/*.xml
@@ -42,7 +51,6 @@
# Do not ignore the following IDEA settings
!.idea/misc.xml
-!.idea/kotlinc.xml
!.idea/codeStyleSettings.xml
!.idea/codeStyles/
!.idea/copyright/
@@ -55,6 +63,10 @@
# Generated source code
**/generated/**
+**/*.pb.dart
+**/*.pbenum.dart
+**/*.pbserver.dart
+**/*.pbjson.dart
# Gradle build files
**/build/**
@@ -78,9 +90,6 @@ gradle-app.setting
# Spine internal directory for storing intermediate artifacts
**/.spine/**
-# Spine model compiler auto-generated resources
-/tools/gradle-plugins/model-compiler/src/main/resources/spine-protoc.gradle
-
# Login details to Maven repository.
# Each workstation should have developer's login defined in this file.
credentials.tar
diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml
index 809943c..f60c273 100644
--- a/.idea/codeStyles/Project.xml
+++ b/.idea/codeStyles/Project.xml
@@ -1,5 +1,6 @@
+
@@ -100,4 +101,4 @@
-
+
\ No newline at end of file
diff --git a/.idea/dictionaries/common.xml b/.idea/dictionaries/common.xml
index e62952a..5e2d460 100644
--- a/.idea/dictionaries/common.xml
+++ b/.idea/dictionaries/common.xml
@@ -24,6 +24,7 @@
handshaker
hohpe
idempotency
+ jspecify
lempira
liskov
melnik
@@ -66,4 +67,4 @@
yevsyukov
-
+
\ No newline at end of file
diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml
index b091734..229f1d3 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 9bfa224..4b46e96 100644
--- a/.idea/kotlinc.xml
+++ b/.idea/kotlinc.xml
@@ -1,13 +1,9 @@
-
-
-
-
-
+
-
+
-
+
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
index a3bc764..31f80ae 100644
--- a/.idea/misc.xml
+++ b/.idea/misc.xml
@@ -40,5 +40,5 @@
-
+
diff --git a/build.gradle.kts b/build.gradle.kts
index b19a46d..c1dd89d 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
@@ -31,7 +31,7 @@ import io.spine.gradle.publish.spinePublishing
import io.spine.gradle.report.coverage.JacocoConfig
import io.spine.gradle.report.license.LicenseReporter
import io.spine.gradle.report.pom.PomGenerator
-import io.spine.gradle.standardToSpineSdk
+import io.spine.gradle.repo.standardToSpineSdk
buildscript {
standardSpineSdkRepositories()
diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts
index a6db455..8b5916f 100644
--- a/buildSrc/build.gradle.kts
+++ b/buildSrc/build.gradle.kts
@@ -39,9 +39,6 @@ plugins {
// https://github.com/jk1/Gradle-License-Report/releases
id("com.github.jk1.dependency-license-report").version("2.7")
-
- // https://github.com/johnrengelman/shadow/releases
- id("com.github.johnrengelman.shadow").version("7.1.2")
}
repositories {
@@ -56,7 +53,7 @@ repositories {
* Please keep this value in sync with [io.spine.dependency.lib.Jackson.version].
* It is not a requirement but would be good in terms of consistency.
*/
-val jacksonVersion = "2.15.3"
+val jacksonVersion = "2.18.3"
/**
* The version of Google Artifact Registry used by `buildSrc`.
@@ -73,12 +70,12 @@ val licenseReportVersion = "2.7"
val grGitVersion = "4.1.1"
/**
- * The version of the Kotlin Gradle plugin and Kotlin binaries used by the build process.
+ * The version of the Kotlin Gradle plugin used by the build process.
*
* This version may change from the [version of Kotlin][io.spine.dependency.lib.Kotlin.version]
* used by the project.
*/
-val kotlinVersion = "1.8.22"
+val kotlinEmbeddedVersion = "2.1.20"
/**
* The version of Guava used in `buildSrc`.
@@ -86,7 +83,7 @@ val kotlinVersion = "1.8.22"
* Always use the same version as the one specified in [io.spine.dependency.lib.Guava].
* Otherwise, when testing Gradle plugins, clashes may occur.
*/
-val guavaVersion = "32.1.3-jre"
+val guavaVersion = "33.4.8-jre"
/**
* The version of ErrorProne Gradle plugin.
@@ -96,7 +93,7 @@ val guavaVersion = "32.1.3-jre"
* @see
* Error Prone Gradle Plugin Releases
*/
-val errorPronePluginVersion = "3.1.0"
+val errorPronePluginVersion = "4.2.0"
/**
* The version of Protobuf Gradle Plugin.
@@ -116,14 +113,14 @@ val protobufPluginVersion = "0.9.4"
* @see
* Dokka Releases
*/
-val dokkaVersion = "1.9.20"
+val dokkaVersion = "2.0.0"
/**
* The version of Detekt Gradle Plugin.
*
* @see Detekt Releases
*/
-val detektVersion = "1.23.0"
+val detektVersion = "1.23.8"
/**
* @see [io.spine.dependency.test.Kotest]
@@ -133,7 +130,7 @@ val kotestJvmPluginVersion = "0.4.10"
/**
* @see [io.spine.dependency.test.Kover]
*/
-val koverVersion = "0.7.2"
+val koverVersion = "0.9.1"
/**
* The version of the Shadow Plugin.
@@ -151,27 +148,26 @@ configurations.all {
"com.google.protobuf:protobuf-gradle-plugin:$protobufPluginVersion",
// Force Kotlin lib versions avoiding using those bundled with Gradle.
- "org.jetbrains.kotlin:kotlin-stdlib:$kotlinVersion",
- "org.jetbrains.kotlin:kotlin-stdlib-common:$kotlinVersion",
- "org.jetbrains.kotlin:kotlin-reflect:$kotlinVersion"
+ "org.jetbrains.kotlin:kotlin-stdlib:$kotlinEmbeddedVersion",
+ "org.jetbrains.kotlin:kotlin-stdlib-common:$kotlinEmbeddedVersion",
+ "org.jetbrains.kotlin:kotlin-reflect:$kotlinEmbeddedVersion"
)
}
}
-val jvmVersion = JavaLanguageVersion.of(11)
-
java {
- toolchain.languageVersion.set(jvmVersion)
+ toolchain.languageVersion.set(JavaLanguageVersion.of(17))
}
kotlin {
compilerOptions {
- jvmTarget = JvmTarget.JVM_11
+ jvmTarget.set(JvmTarget.JVM_17)
}
}
dependencies {
api("com.github.jk1:gradle-license-report:$licenseReportVersion")
+ api(platform("org.jetbrains.kotlin:kotlin-bom:$kotlinEmbeddedVersion"))
dependOnAuthCommon()
listOf(
@@ -180,17 +176,17 @@ dependencies {
"com.github.jk1:gradle-license-report:$licenseReportVersion",
"com.google.guava:guava:$guavaVersion",
"com.google.protobuf:protobuf-gradle-plugin:$protobufPluginVersion",
- "gradle.plugin.com.github.johnrengelman:shadow:${shadowVersion}",
+ "gradle.plugin.com.github.johnrengelman:shadow:$shadowVersion",
"io.gitlab.arturbosch.detekt:detekt-gradle-plugin:$detektVersion",
"io.kotest:kotest-gradle-plugin:$kotestJvmPluginVersion",
// https://github.com/srikanth-lingala/zip4j
"net.lingala.zip4j:zip4j:2.10.0",
- "net.ltgt.gradle:gradle-errorprone-plugin:${errorPronePluginVersion}",
- "org.ajoberstar.grgit:grgit-core:${grGitVersion}",
- "org.jetbrains.dokka:dokka-base:${dokkaVersion}",
+ "net.ltgt.gradle:gradle-errorprone-plugin:$errorPronePluginVersion",
+ "org.ajoberstar.grgit:grgit-core:$grGitVersion",
+ "org.jetbrains.dokka:dokka-base:$dokkaVersion",
"org.jetbrains.dokka:dokka-gradle-plugin:${dokkaVersion}",
- "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlinVersion",
- "org.jetbrains.kotlin:kotlin-reflect:$kotlinVersion",
+ "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlinEmbeddedVersion",
+ "org.jetbrains.kotlin:kotlin-reflect:$kotlinEmbeddedVersion",
"org.jetbrains.kotlinx:kover-gradle-plugin:$koverVersion"
).forEach {
implementation(it)
diff --git a/buildSrc/src/main/kotlin/BuildExtensions.kt b/buildSrc/src/main/kotlin/BuildExtensions.kt
index 0cdfc4e..4f0443d 100644
--- a/buildSrc/src/main/kotlin/BuildExtensions.kt
+++ b/buildSrc/src/main/kotlin/BuildExtensions.kt
@@ -29,13 +29,14 @@
import io.spine.dependency.build.ErrorProne
import io.spine.dependency.build.GradleDoctor
import io.spine.dependency.build.Ksp
+import io.spine.dependency.build.PluginPublishPlugin
import io.spine.dependency.lib.Protobuf
import io.spine.dependency.local.McJava
import io.spine.dependency.local.ProtoData
import io.spine.dependency.local.ProtoTap
import io.spine.dependency.test.Kotest
import io.spine.dependency.test.Kover
-import io.spine.gradle.standardToSpineSdk
+import io.spine.gradle.repo.standardToSpineSdk
import org.gradle.api.Project
import org.gradle.api.Task
import org.gradle.api.tasks.JavaExec
@@ -66,7 +67,7 @@ import org.gradle.plugin.use.PluginDependencySpec
private const val ABOUT_DEPENDENCY_EXTENSIONS = ""
/**
- * Applies [standard][standardToSpineSdk] repositories to this `buildscript`.
+ * Applies [standard][io.spine.gradle.repo.standardToSpineSdk] repositories to this `buildscript`.
*/
fun ScriptHandlerScope.standardSpineSdkRepositories() {
repositories.standardToSpineSdk()
@@ -99,7 +100,7 @@ val ScriptHandlerScope.protoData: ProtoData
* This plugin is published at Gradle Plugin Portal.
* But when used in a pair with [mcJava], it cannot be applied directly to a project.
* It is so, because [mcJava] uses [protoData] as its dependency.
- * And buildscript's classpath ends up with both of them.
+ * And the buildscript's classpath ends up with both of them.
*/
val PluginDependenciesSpec.protoData: ProtoData
get() = ProtoData
@@ -111,8 +112,8 @@ val PluginDependenciesSpec.protoData: ProtoData
* declared in auto-generated `org.gradle.kotlin.dsl.PluginAccessors.kt` file.
* It conflicts with our own declarations.
*
- * Declaring of top-level shortcuts eliminates the need in applying plugins
- * using fully qualified name of dependency objects.
+ * Declaring of top-level shortcuts eliminates the need to apply plugins
+ * using a fully qualified name of dependency objects.
*
* It is still possible to apply a plugin with a custom version, if needed.
* Just declare a version again on the returned [PluginDependencySpec].
@@ -150,6 +151,9 @@ val PluginDependenciesSpec.kover: PluginDependencySpec
val PluginDependenciesSpec.ksp: PluginDependencySpec
get() = id(Ksp.id).version(Ksp.version)
+val PluginDependenciesSpec.`plugin-publish`: PluginDependencySpec
+ get() = id(PluginPublishPlugin.id).version(PluginPublishPlugin.version)
+
/**
* Configures the dependencies between third-party Gradle tasks
* and those defined via ProtoData and Spine Model Compiler.
@@ -184,18 +188,39 @@ fun Project.configureTaskDependencies() {
val launchTestProtoData = "launchTestProtoData"
val generateProto = "generateProto"
val createVersionFile = "createVersionFile"
- "compileKotlin".dependOn(launchProtoData)
- "compileTestKotlin".dependOn(launchTestProtoData)
+ val compileKotlin = "compileKotlin"
+ compileKotlin.run {
+ dependOn(generateProto)
+ dependOn(launchProtoData)
+ }
+ val compileTestKotlin = "compileTestKotlin"
+ compileTestKotlin.dependOn(launchTestProtoData)
val sourcesJar = "sourcesJar"
- sourcesJar.dependOn(generateProto)
- sourcesJar.dependOn(launchProtoData)
- sourcesJar.dependOn(createVersionFile)
- sourcesJar.dependOn("prepareProtocConfigVersions")
+ val kspKotlin = "kspKotlin"
+ sourcesJar.run {
+ dependOn(generateProto)
+ dependOn(launchProtoData)
+ dependOn(kspKotlin)
+ dependOn(createVersionFile)
+ dependOn("prepareProtocConfigVersions")
+ }
val dokkaHtml = "dokkaHtml"
- dokkaHtml.dependOn(generateProto)
- dokkaHtml.dependOn(launchProtoData)
- "dokkaJavadoc".dependOn(launchProtoData)
+ dokkaHtml.run {
+ dependOn(generateProto)
+ dependOn(launchProtoData)
+ dependOn(kspKotlin)
+ }
+ val dokkaJavadoc = "dokkaJavadoc"
+ dokkaJavadoc.run {
+ dependOn(launchProtoData)
+ dependOn(kspKotlin)
+ }
"publishPluginJar".dependOn(createVersionFile)
+ compileKotlin.dependOn(kspKotlin)
+ compileTestKotlin.dependOn("kspTestKotlin")
+ "compileTestFixturesKotlin".dependOn("kspTestFixturesKotlin")
+ "javadocJar".dependOn(dokkaHtml)
+ "dokkaKotlinJar".dependOn(dokkaJavadoc)
}
}
@@ -205,17 +230,38 @@ fun Project.configureTaskDependencies() {
* By convention, such modules are for integration tests and should be treated differently.
*/
val Project.productionModules: Iterable
- get() = rootProject.subprojects.filter { !it.name.contains("-tests") }
+ get() = rootProject.subprojects.filterNot { subproject ->
+ subproject.name.run {
+ contains("-tests")
+ || contains("test-fixtures")
+ || contains("integration-tests")
+ }
+ }
+/**
+ * Obtains the names of the [productionModules].
+ *
+ * The extension could be useful for excluding modules from standard publishing:
+ * ```kotlin
+ * spinePublishing {
+ * val customModule = "my-custom-module"
+ * modules = productionModuleNames.toSet().minus(customModule)
+ * modulesWithCustomPublishing = setOf(customModule)
+ * //...
+ * }
+ * ```
+ */
+val Project.productionModuleNames: List
+ get() = productionModules.map { it.name }
/**
- * Sets the remote debug option for this task.
+ * Sets the remote debug option for this [JavaExec] task.
*
* The port number is [5566][BuildSettings.REMOTE_DEBUG_PORT].
*
* @param enabled If `true` the task will be suspended.
*/
-fun Task.remoteDebug(enabled: Boolean = true) { this as JavaExec
+fun JavaExec.remoteDebug(enabled: Boolean = true) {
debugOptions {
this@debugOptions.enabled.set(enabled)
port.set(BuildSettings.REMOTE_DEBUG_PORT)
@@ -224,6 +270,26 @@ fun Task.remoteDebug(enabled: Boolean = true) { this as JavaExec
}
}
+/**
+ * Sets the remote debug option for the task of [JavaExec] type with the given name.
+ *
+ * The port number is [5566][BuildSettings.REMOTE_DEBUG_PORT].
+ *
+ * @param enabled If `true` the task will be suspended.
+ * @throws IllegalStateException if the task with the given name is not found, or,
+ * if the taks is not of [JavaExec] type.
+ */
+fun Project.setRemoteDebug(taskName: String, enabled: Boolean = true) {
+ val task = tasks.findByName(taskName)
+ check(task != null) {
+ "Could not find a task named `$taskName` in the project `$name`."
+ }
+ check(task is JavaExec) {
+ "The task `$taskName` is not of type `JavaExec`."
+ }
+ task.remoteDebug(enabled)
+}
+
/**
* Sets remote debug options for the `launchProtoData` task.
*
@@ -231,9 +297,8 @@ fun Task.remoteDebug(enabled: Boolean = true) { this as JavaExec
*
* @see remoteDebug
*/
-fun Project.protoDataRemoteDebug(enabled: Boolean = true) {
- tasks.findByName("launchProtoData")?.remoteDebug(enabled)
-}
+fun Project.protoDataRemoteDebug(enabled: Boolean = true) =
+ setRemoteDebug("launchProtoData", enabled)
/**
* Sets remote debug options for the `launchTestProtoData` task.
@@ -242,6 +307,15 @@ fun Project.protoDataRemoteDebug(enabled: Boolean = true) {
*
* @see remoteDebug
*/
-fun Project.testProtoDataRemoteDebug(enabled: Boolean = true) {
- tasks.findByName("launchTestProtoData")?.remoteDebug(enabled)
-}
+fun Project.testProtoDataRemoteDebug(enabled: Boolean = true) =
+ setRemoteDebug("launchTestProtoData", enabled)
+
+/**
+ * Sets remote debug options for the `launchTestFixturesProtoData` task.
+ *
+ * @param enabled if `true` the task will be suspended.
+ *
+ * @see remoteDebug
+ */
+fun Project.testFixturesProtoDataRemoteDebug(enabled: Boolean = true) =
+ setRemoteDebug("launchTestFixturesProtoData", enabled)
diff --git a/buildSrc/src/main/kotlin/BuildSettings.kt b/buildSrc/src/main/kotlin/BuildSettings.kt
index c110090..be1da27 100644
--- a/buildSrc/src/main/kotlin/BuildSettings.kt
+++ b/buildSrc/src/main/kotlin/BuildSettings.kt
@@ -24,14 +24,19 @@
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
+import org.gradle.api.JavaVersion
import org.gradle.jvm.toolchain.JavaLanguageVersion
+import org.jetbrains.kotlin.gradle.dsl.JvmTarget
/**
* This object provides high-level constants, like the version of JVM, to be used
* throughout the project.
*/
object BuildSettings {
- private const val JVM_VERSION = 11
+ private const val JVM_VERSION = 17
val javaVersion: JavaLanguageVersion = JavaLanguageVersion.of(JVM_VERSION)
+ @Suppress("unused")
+ val javaVersionCompat = JavaVersion.toVersion(JVM_VERSION)
+ val jvmTarget = JvmTarget.JVM_17
const val REMOTE_DEBUG_PORT = 5566
}
diff --git a/buildSrc/src/main/kotlin/DependencyResolution.kt b/buildSrc/src/main/kotlin/DependencyResolution.kt
index fb1073e..124adb3 100644
--- a/buildSrc/src/main/kotlin/DependencyResolution.kt
+++ b/buildSrc/src/main/kotlin/DependencyResolution.kt
@@ -29,6 +29,7 @@ import io.spine.dependency.build.CheckerFramework
import io.spine.dependency.build.Dokka
import io.spine.dependency.build.ErrorProne
import io.spine.dependency.build.FindBugs
+import io.spine.dependency.build.JSpecify
import io.spine.dependency.lib.Asm
import io.spine.dependency.lib.AutoCommon
import io.spine.dependency.lib.AutoService
@@ -39,7 +40,6 @@ import io.spine.dependency.lib.CommonsLogging
import io.spine.dependency.lib.Gson
import io.spine.dependency.lib.Guava
import io.spine.dependency.lib.J2ObjC
-import io.spine.dependency.lib.Jackson
import io.spine.dependency.lib.JavaDiffUtils
import io.spine.dependency.lib.Kotlin
import io.spine.dependency.lib.Okio
@@ -49,7 +49,6 @@ import io.spine.dependency.lib.Slf4J
import io.spine.dependency.local.Base
import io.spine.dependency.local.Spine
import io.spine.dependency.test.Hamcrest
-import io.spine.dependency.test.JUnit
import io.spine.dependency.test.Kotest
import io.spine.dependency.test.OpenTest4J
import io.spine.dependency.test.Truth
@@ -86,6 +85,9 @@ fun NamedDomainObjectContainer.forceVersions() {
private fun ResolutionStrategy.forceProductionDependencies() {
@Suppress("DEPRECATION") // Force versions of SLF4J and Kotlin libs.
+ Protobuf.libs.forEach {
+ force(it)
+ }
force(
AnimalSniffer.lib,
AutoCommon.lib,
@@ -97,11 +99,7 @@ private fun ResolutionStrategy.forceProductionDependencies() {
FindBugs.annotations,
Gson.lib,
Guava.lib,
- Kotlin.reflect,
- Kotlin.stdLib,
- Kotlin.stdLibCommon,
- Kotlin.stdLibJdk7,
- Kotlin.stdLibJdk8,
+ JSpecify.annotations,
Protobuf.GradlePlugin.lib,
Protobuf.libs,
Slf4J.lib
@@ -111,11 +109,6 @@ private fun ResolutionStrategy.forceProductionDependencies() {
private fun ResolutionStrategy.forceTestDependencies() {
force(
Guava.testLib,
- JUnit.api,
- JUnit.bom,
- JUnit.Platform.commons,
- JUnit.Platform.launcher,
- JUnit.legacy,
Truth.libs,
Kotest.assertions,
)
@@ -138,16 +131,6 @@ private fun ResolutionStrategy.forceTransitiveDependencies() {
Gson.lib,
Hamcrest.core,
J2ObjC.annotations,
- JUnit.Platform.engine,
- JUnit.Platform.suiteApi,
- JUnit.runner,
- Jackson.annotations,
- Jackson.bom,
- Jackson.core,
- Jackson.databind,
- Jackson.dataformatXml,
- Jackson.dataformatYaml,
- Jackson.moduleKotlin,
JavaDiffUtils.lib,
Kotlin.jetbrainsAnnotations,
Okio.lib,
@@ -199,7 +182,7 @@ fun Project.forceSpineBase() {
@Suppress("unused")
fun Project.forceBaseInProtoTasks() {
configurations.configureEach {
- if (name.lowercased().contains("proto")) {
+ if (name.lowercase().contains("proto")) {
resolutionStrategy {
force(Base.libForBuildScript)
}
diff --git a/buildSrc/src/main/kotlin/DocumentationSettings.kt b/buildSrc/src/main/kotlin/DocumentationSettings.kt
new file mode 100644
index 0000000..b538fae
--- /dev/null
+++ b/buildSrc/src/main/kotlin/DocumentationSettings.kt
@@ -0,0 +1,58 @@
+/*
+ * 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.
+ */
+
+/**
+ * The documentation settings specific to this project.
+ *
+ * @see
+ * Dokka source link configuration
+ */
+@Suppress("ConstPropertyName")
+object DocumentationSettings {
+
+ /**
+ * Settings passed to Dokka for
+ * [sourceLink][[org.jetbrains.dokka.gradle.engine.parameters.DokkaSourceLinkSpec]
+ */
+ object SourceLink {
+
+ /**
+ * The URL of the remote source code
+ * [location][org.jetbrains.dokka.gradle.engine.parameters.DokkaSourceLinkSpec.remoteUrl].
+ */
+ const val url: String = "https://github.com/SpineEventEngine/base/tree/master/src"
+
+ /**
+ * The suffix used to append the source code line number to the URL.
+ *
+ * The suffix depends on the online code repository.
+ *
+ * @see
+ * remoteLineSuffix
+ */
+ const val lineSuffix: String = "#L"
+ }
+}
diff --git a/buildSrc/src/main/kotlin/DokkaExts.kt b/buildSrc/src/main/kotlin/DokkaExts.kt
index 7b0cc49..b141a22 100644
--- a/buildSrc/src/main/kotlin/DokkaExts.kt
+++ b/buildSrc/src/main/kotlin/DokkaExts.kt
@@ -36,13 +36,12 @@ import org.gradle.api.tasks.TaskContainer
import org.gradle.api.tasks.TaskProvider
import org.gradle.api.tasks.bundling.Jar
import org.gradle.kotlin.dsl.DependencyHandlerScope
-import org.jetbrains.dokka.DokkaConfiguration
-import org.jetbrains.dokka.base.DokkaBase
-import org.jetbrains.dokka.base.DokkaBaseConfiguration
-import org.jetbrains.dokka.gradle.AbstractDokkaLeafTask
import org.jetbrains.dokka.gradle.AbstractDokkaTask
+import org.jetbrains.dokka.gradle.DokkaExtension
import org.jetbrains.dokka.gradle.DokkaTask
import org.jetbrains.dokka.gradle.GradleDokkaSourceSetBuilder
+import org.jetbrains.dokka.gradle.engine.parameters.VisibilityModifier
+import org.jetbrains.dokka.gradle.engine.plugins.DokkaHtmlPluginParameters
/**
* To generate the documentation as seen from Java perspective, the `kotlin-as-java`
@@ -69,7 +68,7 @@ fun DependencyHandlerScope.useDokkaWithSpineExtensions() {
private fun DependencyHandler.dokkaPlugin(dependencyNotation: Any): Dependency? =
add("dokkaPlugin", dependencyNotation)
-private fun Project.dokkaOutput(language: String): File {
+internal fun Project.dokkaOutput(language: String): File {
val lng = language.titleCaseFirstChar()
return layout.buildDirectory.dir("docs/dokka$lng").get().asFile
}
@@ -93,51 +92,68 @@ fun Project.dokkaConfigFile(file: String): File {
* @see
* Dokka modifying frontend assets
*/
-fun AbstractDokkaTask.configureStyle() {
- pluginConfiguration {
- customStyleSheets = listOf(project.dokkaConfigFile("styles/custom-styles.css"))
- customAssets = listOf(project.dokkaConfigFile("assets/logo-icon.svg"))
- separateInheritedMembers = true
- footerMessage = "Copyright ${LocalDate.now().year}, TeamDev"
- }
+fun DokkaHtmlPluginParameters.configureStyle(project: Project) {
+ customAssets.from(project.dokkaConfigFile("assets/logo-icon.svg"))
+ customStyleSheets.from(project.dokkaConfigFile("styles/custom-styles.css"))
+ footerMessage.set("Copyright ${LocalDate.now().year}, TeamDev")
+ separateInheritedMembers.set(true)
+ mergeImplicitExpectActualDeclarations.set(false)
}
-private fun AbstractDokkaLeafTask.configureFor(language: String) {
- dokkaSourceSets.configureEach {
- /**
- * Configures links to the external Java documentation.
- */
- jdkVersion.set(BuildSettings.javaVersion.asInt())
+private fun DokkaExtension.configureFor(
+ project: Project,
+ language: String,
+ sourceLinkRemoveUrl: String
+) {
+ dokkaPublications.named("html") {
+ suppressInheritedMembers.set(true)
+ failOnWarning.set(true)
+ }
- skipEmptyPackages.set(true)
+ dokkaSourceSets.named("main") {
+ val moduleDoc = "Module.md"
+ if (project.file(moduleDoc).exists()) {
+ includes.from(moduleDoc)
+ }
- includeNonPublic.set(true)
+ // Please see Dokka docs for more details:
+ // https://kotlinlang.org/docs/dokka-gradle.html#source-link-configuration
+ sourceLink {
+ localDirectory.set(project.file("src/main/${language.lowercase()}"))
+ remoteUrl(sourceLinkRemoveUrl)
+ remoteLineSuffix.set(DocumentationSettings.SourceLink.lineSuffix)
+ }
+
+ // Configures links to the external Java documentation.
+ jdkVersion.set(BuildSettings.javaVersion.asInt())
+ skipEmptyPackages.set(true)
documentedVisibilities.set(
setOf(
- DokkaConfiguration.Visibility.PUBLIC,
- DokkaConfiguration.Visibility.PROTECTED
+ VisibilityModifier.Public,
+ VisibilityModifier.Protected
)
)
}
- outputDirectory.set(project.dokkaOutput(language))
-
- configureStyle()
+ pluginsConfiguration.named("html") { this as DokkaHtmlPluginParameters
+ configureStyle(project)
+ }
}
/**
* Configures this [DokkaTask] to accept only Kotlin files.
*/
-fun AbstractDokkaLeafTask.configureForKotlin() {
- configureFor("kotlin")
+fun DokkaExtension.configureForKotlin(project: Project, sourceLinkRemoteUrl: String) {
+ configureFor(project, "kotlin", sourceLinkRemoteUrl)
}
/**
* Configures this [DokkaTask] to accept only Java files.
*/
-fun AbstractDokkaLeafTask.configureForJava() {
- configureFor("java")
+@Suppress("unused")
+fun DokkaExtension.configureForJava(project: Project, sourceLinkRemoteUrl: String) {
+ configureFor(project, "java", sourceLinkRemoteUrl)
}
/**
@@ -179,16 +195,17 @@ fun Project.dokkaKotlinJar(): TaskProvider = tasks.getOrCreate("dokkaKotlin
}
/**
- * Tells if this task belongs to the execution graph which contains publishing tasks.
+ * Tells if this task belongs to the execution graph which contains
+ * the `publish` and `dokkaGenerate` tasks.
*
- * The task `"publishToMavenLocal"` is excluded from the check because it is a part of
- * the local testing workflow.
+ * This predicate could be useful for disabling publishing tasks
+ * when doing, e.g., `publishToMavenLocal` for the purpose of the
+ * integration tests that (of course) do not test the documentation
+ * generation proces and its resuults.
*/
fun AbstractDokkaTask.isInPublishingGraph(): Boolean =
project.gradle.taskGraph.allTasks.any {
- with(it.name) {
- startsWith("publish") && !startsWith("publishToMavenLocal")
- }
+ it.name == "publish" || it.name.contains("dokkaGenerate")
}
/**
@@ -217,7 +234,7 @@ fun Project.dokkaJavaJar(): TaskProvider = tasks.getOrCreate("dokkaJavaJar"
fun Project.disableDocumentationTasks() {
gradle.taskGraph.whenReady {
tasks.forEach { task ->
- val lowercaseName = task.name.lowercased()
+ val lowercaseName = task.name.lowercase()
if (lowercaseName.contains("dokka") || lowercaseName.contains("javadoc")) {
task.enabled = false
}
diff --git a/buildSrc/src/main/kotlin/LicenseSettings.kt b/buildSrc/src/main/kotlin/LicenseSettings.kt
new file mode 100644
index 0000000..465129f
--- /dev/null
+++ b/buildSrc/src/main/kotlin/LicenseSettings.kt
@@ -0,0 +1,43 @@
+/*
+* 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.
+*/
+
+/**
+ * The settings of the software license which apply to the code of this project.
+ *
+ * The constants defined in this object are used by the
+ * [PublicationHandler][io.spine.gradle.publish.PublicationHandler] to set up
+ * corresponding properties of the published `pom.xml` file of an artifact.
+ *
+ * So, in order to adapt the license settings to the requirements of a particular project,
+ * simply change the values of the constants defined in this object.
+ *
+ * @see io.spine.gradle.publish.PublicationHandler
+ */
+@Suppress("ConstPropertyName") // https://bit.ly/kotlin-prop-names
+object LicenseSettings {
+ const val name = "The Apache License, Version 2.0"
+ const val url = "https://www.apache.org/licenses/LICENSE-2.0.txt"
+}
diff --git a/buildSrc/src/main/kotlin/Strings.kt b/buildSrc/src/main/kotlin/Strings.kt
index 0988651..19e0c21 100644
--- a/buildSrc/src/main/kotlin/Strings.kt
+++ b/buildSrc/src/main/kotlin/Strings.kt
@@ -41,19 +41,10 @@ private const val ABOUT = ""
/**
* Makes the first character come in the title case.
*/
-fun String.titleCaseFirstChar(): String {
- return replaceFirstChar { it.titlecase() }
- // OR for earlier Kotlin versions:
- // 1. add import of `org.gradle.configurationcache.extensions.capitalized`
- // 2. call `capitalized()` instead of `replaceFirstChar` above.
- // return capitalized()
-}
+fun String.titleCaseFirstChar(): String = replaceFirstChar { it.titlecase() }
/**
* Converts this string to lowercase.
*/
-fun String.lowercased(): String {
- return lowercase()
- // OR for earlier Kotlin versions call:
- // return toLowerCase()
-}
+@Deprecated(message = "Please use `lowercase()` instead.", replaceWith = ReplaceWith("lowercase"))
+fun String.lowercased(): String = lowercase()
diff --git a/buildSrc/src/main/kotlin/compile-protobuf.gradle.kts b/buildSrc/src/main/kotlin/compile-protobuf.gradle.kts
index 57a6b96..4acbb86 100644
--- a/buildSrc/src/main/kotlin/compile-protobuf.gradle.kts
+++ b/buildSrc/src/main/kotlin/compile-protobuf.gradle.kts
@@ -32,13 +32,21 @@ plugins {
id("com.google.protobuf")
}
-
// For generating test fixtures. See `src/test/proto`.
protobuf {
configurations.excludeProtobufLite()
protoc {
artifact = Protobuf.compiler
}
+
+ afterEvaluate {
+ // Walk the collection of tasks to force the execution
+ // of the `configureEach` operations earlier.
+ // This hack allows to avoid `ConcurrentModificationException` on
+ // creating `kspKotlin` task.
+ generateProtoTasks.all().size
+ }
+
generateProtoTasks.all().configureEach {
setup()
}
diff --git a/buildSrc/src/main/kotlin/dokka-for-java.gradle.kts b/buildSrc/src/main/kotlin/dokka-for-java.gradle.kts
index ee22622..6bab079 100644
--- a/buildSrc/src/main/kotlin/dokka-for-java.gradle.kts
+++ b/buildSrc/src/main/kotlin/dokka-for-java.gradle.kts
@@ -24,7 +24,7 @@
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-import org.jetbrains.dokka.gradle.AbstractDokkaLeafTask
+import org.jetbrains.dokka.gradle.DokkaTaskPartial
plugins {
id("org.jetbrains.dokka") // Cannot use `Dokka` dependency object here yet.
@@ -35,9 +35,17 @@ dependencies {
useDokkaWithSpineExtensions()
}
-tasks.withType().configureEach {
- configureForJava()
+afterEvaluate {
+ dokka {
+ configureForKotlin(
+ project,
+ DocumentationSettings.SourceLink.url
+ )
+ }
+}
+
+tasks.withType().configureEach {
onlyIf {
- (it as AbstractDokkaLeafTask).isInPublishingGraph()
+ isInPublishingGraph()
}
}
diff --git a/buildSrc/src/main/kotlin/dokka-for-kotlin.gradle.kts b/buildSrc/src/main/kotlin/dokka-for-kotlin.gradle.kts
index e50b10a..c24135e 100644
--- a/buildSrc/src/main/kotlin/dokka-for-kotlin.gradle.kts
+++ b/buildSrc/src/main/kotlin/dokka-for-kotlin.gradle.kts
@@ -24,7 +24,7 @@
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-import org.jetbrains.dokka.gradle.AbstractDokkaLeafTask
+import org.jetbrains.dokka.gradle.DokkaTaskPartial
plugins {
id("org.jetbrains.dokka") // Cannot use `Dokka` dependency object here yet.
@@ -34,9 +34,17 @@ dependencies {
useDokkaWithSpineExtensions()
}
-tasks.withType().configureEach {
- configureForKotlin()
+afterEvaluate {
+ dokka {
+ configureForKotlin(
+ project,
+ DocumentationSettings.SourceLink.url
+ )
+ }
+}
+
+tasks.withType().configureEach {
onlyIf {
- (it as AbstractDokkaLeafTask).isInPublishingGraph()
+ isInPublishingGraph()
}
}
diff --git a/buildSrc/src/main/kotlin/io/spine/dependency/Dependency.kt b/buildSrc/src/main/kotlin/io/spine/dependency/Dependency.kt
new file mode 100644
index 0000000..87f1174
--- /dev/null
+++ b/buildSrc/src/main/kotlin/io/spine/dependency/Dependency.kt
@@ -0,0 +1,116 @@
+/*
+ * 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
+
+import io.spine.gradle.log
+import org.gradle.api.Project
+import org.gradle.api.artifacts.Configuration
+import org.gradle.api.artifacts.ResolutionStrategy
+
+/**
+ * A dependency is a software component we use in a project.
+ *
+ * It could be a library, a set of libraries, or a development tool
+ * that participates in a build.
+ */
+abstract class Dependency {
+
+ /**
+ * The version of the dependency in terms of Maven coordinates.
+ */
+ abstract val version: String
+
+ /**
+ * The group of the dependency in terms of Maven coordinates.
+ */
+ abstract val group: String
+
+ /**
+ * The modules of the dependency that we use directly or
+ * transitively in our projects.
+ */
+ abstract val modules: List
+
+ /**
+ * The [modules] given with the [version].
+ */
+ final val artifacts: Map by lazy {
+ modules.associateWith { "$it:$version" }
+ }
+
+ /**
+ * Obtains full Maven coordinates for the requested [module].
+ */
+ fun artifact(module: String): String = artifacts[module] ?: error(
+ "The dependency `${this::class.simpleName}` does not declare a module `$module`."
+ )
+
+ /**
+ * Forces all artifacts of this dependency using the given resolution strategy.
+ *
+ * @param project The project in which the artifacts are forced. Used for logging.
+ * @param cfg The configuration for which the artifacts are forced. Used for logging.
+ * @param rs The resolution strategy which forces the artifacts.
+ */
+ fun forceArtifacts(project: Project, cfg: Configuration, rs: ResolutionStrategy) {
+ artifacts.values.forEach {
+ rs.forceWithLogging(project, cfg, it)
+ }
+ }
+}
+
+/**
+ * A dependency which declares a Maven Bill of Materials (BOM).
+ *
+ * @see
+ * Maven Bill of Materials
+ * @see io.spine.dependency.boms.Boms
+ * @see io.spine.dependency.boms.BomsPlugin
+ */
+abstract class DependencyWithBom : Dependency() {
+
+ /**
+ * Maven coordinates of the dependency BOM.
+ */
+ abstract val bom: String
+}
+
+/**
+ * Returns the suffix of diagnostic messages for this configuration in the given project.
+ */
+fun Configuration.diagSuffix(project: Project): String =
+ "the configuration `$name` in the project: `${project.path}`."
+
+
+private fun ResolutionStrategy.forceWithLogging(
+ project: Project,
+ configuration: Configuration,
+ artifact: String
+) {
+ force(artifact)
+ project.log { "Forced the version of `$artifact` in " + configuration.diagSuffix(project) }
+}
diff --git a/buildSrc/src/main/kotlin/io/spine/dependency/boms/Boms.kt b/buildSrc/src/main/kotlin/io/spine/dependency/boms/Boms.kt
new file mode 100644
index 0000000..df1751b
--- /dev/null
+++ b/buildSrc/src/main/kotlin/io/spine/dependency/boms/Boms.kt
@@ -0,0 +1,66 @@
+/*
+ * 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.boms
+
+import io.spine.dependency.DependencyWithBom
+import io.spine.dependency.kotlinx.Coroutines
+import io.spine.dependency.lib.Jackson
+import io.spine.dependency.lib.Kotlin
+import io.spine.dependency.lib.Grpc
+import io.spine.dependency.test.JUnit
+
+/**
+ * The collection of references to BOMs applied by [BomsPlugin].
+ *
+ * @see
+ * Maven Bill of Materials
+ */
+object Boms {
+
+ /**
+ * The base production BOMs.
+ */
+ val core: List = listOf(
+ Kotlin,
+ Coroutines
+ )
+
+ /**
+ * The BOMs for testing dependencies.
+ */
+ val testing: List = listOf(
+ JUnit
+ )
+
+ /**
+ * Technology-based BOMs.
+ */
+ object Optional {
+ val jackson = Jackson.bom
+ val grpc = Grpc.bom
+ }
+}
diff --git a/buildSrc/src/main/kotlin/io/spine/dependency/boms/BomsPlugin.kt b/buildSrc/src/main/kotlin/io/spine/dependency/boms/BomsPlugin.kt
new file mode 100644
index 0000000..2724dda
--- /dev/null
+++ b/buildSrc/src/main/kotlin/io/spine/dependency/boms/BomsPlugin.kt
@@ -0,0 +1,185 @@
+/*
+ * 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.boms
+
+import io.gitlab.arturbosch.detekt.getSupportedKotlinVersion
+import io.spine.dependency.DependencyWithBom
+import io.spine.dependency.diagSuffix
+import io.spine.dependency.kotlinx.Coroutines
+import io.spine.dependency.lib.Kotlin
+import io.spine.dependency.test.JUnit
+import io.spine.gradle.log
+import org.gradle.api.Plugin
+import org.gradle.api.Project
+import org.gradle.api.artifacts.Configuration
+import org.gradle.api.artifacts.ConfigurationContainer
+
+/**
+ * The plugin which forces versions of platforms declared in the [Boms] object.
+ *
+ * Versions are enforced via the
+ * [org.gradle.api.artifacts.dsl.DependencyHandler.enforcedPlatform] call
+ * for configurations of the project to which the plugin is applied.
+ *
+ * The configurations are selected by the "kind" of BOM.
+ *
+ * [Boms.core] are applied to:
+ * 1. Production configurations, such as `api` or `implementation`.
+ * 2. Compilation configurations.
+ * 3. All `ksp` configurations.
+ *
+ * [Boms.testing] are applied to all testing configurations.
+ *
+ * In addition to forcing BOM-based dependencies,
+ * the plugin [forces][org.gradle.api.artifacts.ResolutionStrategy.force] the versions
+ * of [Kotlin.StdLib.artifacts] for all configurations because even through Kotlin
+ * artifacts are forced with BOM, the `variants` in the dependencies cannot be
+ * picked by Gradle.
+ *
+ * Run Gradle with the [INFO][org.gradle.api.logging.Logger.isInfoEnabled] logging level
+ * to see the dependencies forced by this plugin.
+ */
+class BomsPlugin : Plugin {
+
+ private val productionConfigs = listOf(
+ "api",
+ "implementation",
+ "compileOnly",
+ "runtimeOnly"
+ )
+
+ override fun apply(project: Project) = with(project) {
+
+ configurations.run {
+ matching { isCompilationConfig(it.name) }.all {
+ applyBoms(project, Boms.core)
+ }
+ matching { isKspConfig(it.name) }.all {
+ applyBoms(project, Boms.core)
+ }
+ matching { it.name in productionConfigs }.all {
+ applyBoms(project, Boms.core)
+ }
+ matching { isTestConfig(it.name) }.all {
+ applyBoms(project, Boms.core + Boms.testing)
+ }
+
+ matching { !supportsBom(it.name) }.all {
+ resolutionStrategy.eachDependency {
+ if (requested.group == Kotlin.group) {
+ val kotlinVersion = Kotlin.runtimeVersion
+ useVersion(kotlinVersion)
+ val suffix = this@all.diagSuffix(project)
+ log { "Forced Kotlin version `$kotlinVersion` in $suffix" }
+ }
+ }
+ }
+
+ selectKotlinCompilerForDetekt()
+ project.forceArtifacts()
+ }
+ }
+}
+
+private fun Configuration.applyBoms(project: Project, deps: List) {
+ deps.forEach { dep ->
+ withDependencies {
+ val platform = project.dependencies.platform(dep.bom)
+ addLater(project.provider { platform })
+ project.log {
+ "Applied BOM: `${dep.bom}` to the configuration: `${this@applyBoms.name}`."
+ }
+ }
+ }
+}
+
+private val Configuration.isDetekt: Boolean
+ get() = name.contains("detekt", ignoreCase = true)
+
+@Suppress("UnstableApiUsage") // `io.gitlab.arturbosch.detekt.getSupportedKotlinVersion`
+private fun ConfigurationContainer.selectKotlinCompilerForDetekt() =
+ matching { it.isDetekt }
+ .configureEach {
+ resolutionStrategy.eachDependency {
+ if (requested.group == Kotlin.group) {
+ val supportedVersion = getSupportedKotlinVersion()
+ useVersion(supportedVersion)
+ because("Force Kotlin version $supportedVersion in Detekt configurations.")
+ }
+ }
+ }
+
+private fun isCompilationConfig(name: String) =
+ name.contains("compile", ignoreCase = true) &&
+ // `compileProtoPath` or `compileTestProtoPath`.
+ !name.contains("ProtoPath", ignoreCase = true)
+
+private fun isKspConfig(name: String) =
+ name.startsWith("ksp", ignoreCase = true)
+
+private fun isTestConfig(name: String) =
+ name.startsWith("test", ignoreCase = true)
+
+/**
+ * Tells if the configuration with the given [name] supports forcing
+ * versions via the BOM mechanism.
+ *
+ * Not all configurations support forcing via BOM. E.g., the configurations created
+ * by Protobuf Gradle Plugin such as `compileProtoPath` or `extractIncludeProto` do
+ * not pick up versions of dependencies set via `enforcedPlatform(myBom)`.
+ */
+private fun supportsBom(name: String) =
+ (isCompilationConfig(name) || isKspConfig(name) || isTestConfig(name))
+
+/**
+ * Forces the versions of the artifacts that are even being correctly selected by BOMs
+ * are not guaranteed to be handled correctly when Gradle picks up a `variant`.
+ *
+ * The function forces the versions for all configurations but [detekt][isDetekt], because
+ * it requires a compatible version of the Kotlin compiler.
+ *
+ * @see Kotlin.artifacts
+ * @see Kotlin.StdLib.artifacts
+ * @see Coroutines.artifacts
+ * @see selectKotlinCompilerForDetekt
+ */
+private fun Project.forceArtifacts() =
+ configurations.all {
+ resolutionStrategy {
+ if (!isDetekt) {
+ val rs = this@resolutionStrategy
+ val project = this@forceArtifacts
+ val cfg = this@all
+ Kotlin.forceArtifacts(project, cfg, rs)
+ Kotlin.StdLib.forceArtifacts(project, cfg, rs)
+ Coroutines.forceArtifacts(project, cfg, rs)
+ JUnit.Jupiter.forceArtifacts(project, cfg, rs) /*
+ for configurations like `testFixturesCompileProtoPath`.
+ */
+ }
+ }
+ }
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 41757db..003bf58 100644
--- a/buildSrc/src/main/kotlin/io/spine/dependency/build/Dokka.kt
+++ b/buildSrc/src/main/kotlin/io/spine/dependency/build/Dokka.kt
@@ -35,7 +35,7 @@ object Dokka {
* When changing the version, also change the version used in the
* `buildSrc/build.gradle.kts`.
*/
- const val version = "1.9.20"
+ const val version = "2.0.0"
object GradlePlugin {
const val id = "org.jetbrains.dokka"
@@ -78,7 +78,7 @@ object Dokka {
object SpineExtensions {
private const val group = "io.spine.tools"
- const val version = "2.0.0-SNAPSHOT.6"
+ 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/ErrorProne.kt b/buildSrc/src/main/kotlin/io/spine/dependency/build/ErrorProne.kt
index 6aba7b4..5b47c1b 100644
--- a/buildSrc/src/main/kotlin/io/spine/dependency/build/ErrorProne.kt
+++ b/buildSrc/src/main/kotlin/io/spine/dependency/build/ErrorProne.kt
@@ -30,7 +30,7 @@ package io.spine.dependency.build
@Suppress("unused", "ConstPropertyName")
object ErrorProne {
// https://github.com/google/error-prone
- private const val version = "2.23.0"
+ private const val version = "2.36.0"
const val group = "com.google.errorprone"
@@ -56,7 +56,7 @@ object ErrorProne {
* When the plugin is used as a library (e.g., in tools), its version and the library
* artifacts are of importance.
*/
- const val version = "3.1.0"
+ const val version = "4.1.0"
const val lib = "net.ltgt.gradle:gradle-errorprone-plugin:$version"
}
}
diff --git a/buildSrc/src/main/kotlin/io/spine/dependency/build/JSpecify.kt b/buildSrc/src/main/kotlin/io/spine/dependency/build/JSpecify.kt
new file mode 100644
index 0000000..d884ffb
--- /dev/null
+++ b/buildSrc/src/main/kotlin/io/spine/dependency/build/JSpecify.kt
@@ -0,0 +1,40 @@
+/*
+ * 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
+
+/**
+ * An artifact of well-specified annotations to power static analysis
+ * checks and JVM language interop. Developed by consensus of the partner
+ * organizations listed at [the project site](https://jspecify.org).
+ *
+ * @see JSpecify at GitHub
+ */
+@Suppress("ConstPropertyName")
+object JSpecify {
+ const val version = "1.0.0"
+ const val annotations = "org.jspecify:jspecify:$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 27c8633..cb570a0 100644
--- a/buildSrc/src/main/kotlin/io/spine/dependency/build/Ksp.kt
+++ b/buildSrc/src/main/kotlin/io/spine/dependency/build/Ksp.kt
@@ -31,23 +31,14 @@ package io.spine.dependency.build
*
* @see KSP GitHub repository
*/
-@Suppress("ConstPropertyName")
+@Suppress("ConstPropertyName", "unused")
object Ksp {
-
- /**
- * The latest version compatible with Kotlin v1.8.22, which is bundled with Gradle 7.6.4.
- *
- * We need to stick to this version until we migrate to newer Gradle.
- * Trying to use a newer version results in the following console output:
- * ```
- * ksp-1.9.24-1.0.20 is too new for kotlin-1.8.22. Please upgrade kotlin-gradle-plugin to 1.9.24.
- * ```
- *
- * The version compatible with Kotlin v1.9.24 compiler is 1.9.24-1.0.20.
- */
- const val version = "1.8.22-1.0.11"
+ const val version = "2.1.20-2.0.0"
const val id = "com.google.devtools.ksp"
const val group = "com.google.devtools.ksp"
const val symbolProcessingApi = "$group:symbol-processing-api:$version"
const val symbolProcessing = "$group:symbol-processing:$version"
+ const val symbolProcessingAaEmb = "$group:symbol-processing-aa-embeddable:$version"
+ const val symbolProcessingCommonDeps = "$group:symbol-processing-common-deps:$version"
+ const val gradlePlugin = "$group:symbol-processing-gradle-plugin:$version"
}
diff --git a/buildSrc/src/main/kotlin/io/spine/dependency/build/PluginPublishPlugin.kt b/buildSrc/src/main/kotlin/io/spine/dependency/build/PluginPublishPlugin.kt
new file mode 100644
index 0000000..12c28f8
--- /dev/null
+++ b/buildSrc/src/main/kotlin/io/spine/dependency/build/PluginPublishPlugin.kt
@@ -0,0 +1,42 @@
+/*
+ * 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.
+ */
+
+@file:Suppress("unused")
+
+package io.spine.dependency.build
+
+/**
+ * The Gradle plugin for publishing Gradle plugins to the Gradle Plugin Portal.
+ *
+ * @see
+ * The plugin page at the Portal
+ * @see Publishing Rules
+ */
+@Suppress("ConstPropertyName")
+object PluginPublishPlugin {
+ const val version = "1.3.1"
+ const val id = "com.gradle.plugin-publish"
+}
diff --git a/buildSrc/src/main/kotlin/io/spine/dependency/build/Pmd.kt b/buildSrc/src/main/kotlin/io/spine/dependency/build/Pmd.kt
index e4f7fdd..dd71b49 100644
--- a/buildSrc/src/main/kotlin/io/spine/dependency/build/Pmd.kt
+++ b/buildSrc/src/main/kotlin/io/spine/dependency/build/Pmd.kt
@@ -31,12 +31,5 @@ package io.spine.dependency.build
// https://github.com/pmd/pmd/releases
@Suppress("unused", "ConstPropertyName")
object Pmd {
- /**
- * This is the last version in the 6.x series.
- *
- * There's a major update to 7.x series.
- *
- * @see GitHub project
+ */
+object Coroutines : DependencyWithBom() {
+ override val group = KotlinX.group
+ override val version = "1.10.2"
+
+ @Suppress("ConstPropertyName") // https://bit.ly/kotlin-prop-names
+ const val infix = "kotlinx-coroutines"
+
+ override val bom = "$group:$infix-bom:$version"
+
+ val core = "$group:$infix-core"
+ val coreJvm = "$group:$infix-core-jvm"
+ val jdk7 = "$group:$infix-jdk7"
+ val jdk8 = "$group:$infix-jdk8"
+ val debug = "$group:$infix-debug"
+ val test = "$group:$infix-test"
+ val testJvm = "$group:$infix-test-jvm"
+
+ override val modules = listOf(core, coreJvm, jdk7, jdk8, debug, test, testJvm)
+}
diff --git a/buildSrc/src/main/kotlin/io/spine/dependency/kotlinx/KotlinX.kt b/buildSrc/src/main/kotlin/io/spine/dependency/kotlinx/KotlinX.kt
new file mode 100644
index 0000000..fa34b0f
--- /dev/null
+++ b/buildSrc/src/main/kotlin/io/spine/dependency/kotlinx/KotlinX.kt
@@ -0,0 +1,32 @@
+/*
+ * 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.kotlinx
+
+@Suppress("ConstPropertyName") // https://bit.ly/kotlin-prop-names
+object KotlinX {
+ const val group = "org.jetbrains.kotlinx"
+}
diff --git a/buildSrc/src/main/kotlin/io/spine/dependency/kotlinx/Serialization.kt b/buildSrc/src/main/kotlin/io/spine/dependency/kotlinx/Serialization.kt
new file mode 100644
index 0000000..08e436d
--- /dev/null
+++ b/buildSrc/src/main/kotlin/io/spine/dependency/kotlinx/Serialization.kt
@@ -0,0 +1,73 @@
+/*
+ * 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.kotlinx
+
+/**
+ * The [KotlinX Serialization](https://github.com/Kotlin/kotlinx.serialization) library.
+ */
+@Suppress("ConstPropertyName") // https://bit.ly/kotlin-prop-names
+object Serialization {
+
+ const val group = KotlinX.group
+
+ /**
+ * The version of the library.
+ *
+ * @see Releases
+ */
+ const val version = "1.8.1"
+
+ private const val infix = "kotlinx-serialization"
+ const val bom = "$group:$infix-bom:$version"
+ const val coreJvm = "$group:$infix-core-jvm"
+ const val json = "$group:$infix-json"
+
+ /**
+ * The [Gradle plugin](https://github.com/Kotlin/kotlinx.serialization/tree/master?tab=readme-ov-file#gradle)
+ * for using the serialization library.
+ *
+ * Usage:
+ * ```kotlin
+ * plugins {
+ * // ...
+ * kotlin(Serialization.GradlePlugin.shortId) version Kotlin.version
+ * }
+ * ```
+ */
+ object GradlePlugin {
+
+ /**
+ * The ID to be used with the `kotlin(shortId)` DSL under the`plugins { }` block.
+ */
+ const val shortId = "plugin.serialization"
+
+ /**
+ * The full ID of the plugin.
+ */
+ const val id = "org.jetbrains.kotlin.$shortId"
+ }
+}
diff --git a/buildSrc/src/main/kotlin/io/spine/dependency/lib/Aedile.kt b/buildSrc/src/main/kotlin/io/spine/dependency/lib/Aedile.kt
index eea6e02..1a623f3 100644
--- a/buildSrc/src/main/kotlin/io/spine/dependency/lib/Aedile.kt
+++ b/buildSrc/src/main/kotlin/io/spine/dependency/lib/Aedile.kt
@@ -27,12 +27,12 @@
package io.spine.dependency.lib
/**
- * A Kotlin wrapper over [Caffeine].
+ * A Kotlin wrapper over [io.spine.dependency.lib.Caffeine].
*
* @see Aedile at GitHub
*/
@Suppress("unused")
object Aedile {
- private const val version = "1.3.1"
+ private const val version = "2.1.2"
const val lib = "com.sksamuel.aedile:aedile-core:$version"
}
diff --git a/buildSrc/src/main/kotlin/io/spine/dependency/lib/Caffeine.kt b/buildSrc/src/main/kotlin/io/spine/dependency/lib/Caffeine.kt
index 9b0c7c1..23f44a4 100644
--- a/buildSrc/src/main/kotlin/io/spine/dependency/lib/Caffeine.kt
+++ b/buildSrc/src/main/kotlin/io/spine/dependency/lib/Caffeine.kt
@@ -30,12 +30,14 @@ package io.spine.dependency.lib
* A [high performance](https://github.com/ben-manes/caffeine/wiki/Benchmarks),
* [near optimal](https://github.com/ben-manes/caffeine/wiki/Efficiency) caching library.
*
- * This library is a transitive dependency for us via ErrorProne.
+ * This library is a transitive dependency for us via
+ * [io.spine.dependency.lib.Aedile] and
+ * [io.spine.dependency.build.ErrorProne].
*
* @see Caffeine at GitHub
*/
@Suppress("unused")
object Caffeine {
- private const val version = "3.0.5"
+ private const val version = "3.2.0"
const val lib = "com.github.ben-manes.caffeine:caffeine:$version"
}
diff --git a/buildSrc/src/main/kotlin/io/spine/dependency/lib/Coroutines.kt b/buildSrc/src/main/kotlin/io/spine/dependency/lib/Coroutines.kt
index cb3c281..2073d76 100644
--- a/buildSrc/src/main/kotlin/io/spine/dependency/lib/Coroutines.kt
+++ b/buildSrc/src/main/kotlin/io/spine/dependency/lib/Coroutines.kt
@@ -28,14 +28,25 @@ package io.spine.dependency.lib
/**
* Kotlin Coroutines.
- *
+ *
* @see GitHub projecet
*/
-@Suppress("unused")
+@Suppress("unused", "ConstPropertyName")
+@Deprecated(
+ message = "Please use `Coroutines` from the `io.spine.dependency.kotlinx` package",
+ replaceWith = ReplaceWith(
+ expression = "Coroutines",
+ imports = ["io.spine.dependency.kotlinx.Coroutines"]
+ )
+)
object Coroutines {
- const val version = "1.6.4"
- const val jdk8 = "org.jetbrains.kotlinx:kotlinx-coroutines-jdk8:$version"
- const val core = "org.jetbrains.kotlinx:kotlinx-coroutines-core:$version"
- const val bom = "org.jetbrains.kotlinx:kotlinx-coroutines-bom:$version"
- const val coreJvm = "org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:$version"
+ const val group = "org.jetbrains.kotlinx"
+ val version = io.spine.dependency.kotlinx.Coroutines.version
+ val bom = "$group:kotlinx-coroutines-bom:$version"
+ val core = "$group:kotlinx-coroutines-core:$version"
+ val coreJvm = "$group:kotlinx-coroutines-core-jvm:$version"
+ val jdk8 = "$group:kotlinx-coroutines-jdk8:$version"
+ val debug = "$group:kotlinx-coroutines-debug:$version"
+ val test = "$group:kotlinx-coroutines-test:$version"
+ val testJvm = "$group:kotlinx-coroutines-test-jvm:$version"
}
diff --git a/buildSrc/src/main/kotlin/io/spine/dependency/lib/Grpc.kt b/buildSrc/src/main/kotlin/io/spine/dependency/lib/Grpc.kt
index 011b4d2..435d6b4 100644
--- a/buildSrc/src/main/kotlin/io/spine/dependency/lib/Grpc.kt
+++ b/buildSrc/src/main/kotlin/io/spine/dependency/lib/Grpc.kt
@@ -26,26 +26,58 @@
package io.spine.dependency.lib
+import io.spine.dependency.DependencyWithBom
+
// https://github.com/grpc/grpc-java
-@Suppress("unused", "ConstPropertyName")
-object Grpc {
- @Suppress("MemberVisibilityCanBePrivate")
- const val version = "1.59.0"
- const val group = "io.grpc"
- const val api = "$group:grpc-api:$version"
- const val auth = "$group:grpc-auth:$version"
- const val core = "$group:grpc-core:$version"
- const val context = "$group:grpc-context:$version"
- const val inProcess = "$group:grpc-inprocess:$version"
- const val stub = "$group:grpc-stub:$version"
- const val okHttp = "$group:grpc-okhttp:$version"
- const val protobuf = "$group:grpc-protobuf:$version"
- const val protobufLite = "$group:grpc-protobuf-lite:$version"
- const val netty = "$group:grpc-netty:$version"
- const val nettyShaded = "$group:grpc-netty-shaded:$version"
+@Suppress("unused")
+object Grpc : DependencyWithBom() {
+
+ override val version = "1.72.0"
+ override val group = "io.grpc"
+ override val bom = "$group:grpc-bom:$version"
+
+ val api = "$group:grpc-api"
+ val auth = "$group:grpc-auth"
+ val core = "$group:grpc-core"
+ val context = "$group:grpc-context"
+ val inProcess = "$group:grpc-inprocess"
+ val stub = "$group:grpc-stub"
+ val okHttp = "$group:grpc-okhttp"
+ val protobuf = "$group:grpc-protobuf"
+ val protobufLite = "$group:grpc-protobuf-lite"
+ val netty = "$group:grpc-netty"
+ val nettyShaded = "$group:grpc-netty-shaded"
+
+ override val modules = listOf(
+ api,
+ auth,
+ core,
+ context,
+ inProcess,
+ stub,
+ okHttp,
+ protobuf,
+ protobufLite,
+ netty,
+ nettyShaded
+ )
+
object ProtocPlugin {
const val id = "grpc"
- const val artifact = "$group:protoc-gen-grpc-java:$version"
+ @Deprecated(
+ message = "Please use `GrpcKotlin.ProtocPlugin.artifact` instead.",
+ replaceWith = ReplaceWith("GrpcKotlin.ProtocPlugin.artifact")
+ )
+ const val kotlinPluginVersion = GrpcKotlin.version
+ val artifact = "$group:protoc-gen-grpc-java:$version"
+
+ // https://github.com/grpc/grpc-kotlin
+ // https://repo.maven.apache.org/maven2/io/grpc/protoc-gen-grpc-kotlin/
+ @Deprecated(
+ message = "Please use `GrpcKotlin.ProtocPlugin.artifact` instead.",
+ replaceWith = ReplaceWith("GrpcKotlin.ProtocPlugin.artifact")
+ )
+ const val artifactKotlin = GrpcKotlin.ProtocPlugin.artifact
}
}
diff --git a/buildSrc/src/main/kotlin/io/spine/dependency/lib/GrpcKotlin.kt b/buildSrc/src/main/kotlin/io/spine/dependency/lib/GrpcKotlin.kt
index e695f6f..05d21dd 100644
--- a/buildSrc/src/main/kotlin/io/spine/dependency/lib/GrpcKotlin.kt
+++ b/buildSrc/src/main/kotlin/io/spine/dependency/lib/GrpcKotlin.kt
@@ -33,11 +33,12 @@ package io.spine.dependency.lib
*/
@Suppress("unused")
object GrpcKotlin {
- const val version = "1.3.0"
+ const val version = "1.4.1"
const val stub = "io.grpc:grpc-kotlin-stub:$version"
object ProtocPlugin {
const val id = "grpckt"
+ // https://central.sonatype.com/artifact/io.grpc/protoc-gen-grpc-kotlin
const val artifact = "io.grpc:protoc-gen-grpc-kotlin:$version:jdk8@jar"
}
}
diff --git a/buildSrc/src/main/kotlin/io/spine/dependency/lib/Gson.kt b/buildSrc/src/main/kotlin/io/spine/dependency/lib/Gson.kt
index 229c434..da9ae93 100644
--- a/buildSrc/src/main/kotlin/io/spine/dependency/lib/Gson.kt
+++ b/buildSrc/src/main/kotlin/io/spine/dependency/lib/Gson.kt
@@ -34,6 +34,6 @@ package io.spine.dependency.lib
*/
@Suppress("unused", "ConstPropertyName")
object Gson {
- private const val version = "2.10.1"
+ private const val version = "2.13.0"
const val lib = "com.google.code.gson:gson:$version"
}
diff --git a/buildSrc/src/main/kotlin/io/spine/dependency/lib/Guava.kt b/buildSrc/src/main/kotlin/io/spine/dependency/lib/Guava.kt
index 5ea5fcc..9115701 100644
--- a/buildSrc/src/main/kotlin/io/spine/dependency/lib/Guava.kt
+++ b/buildSrc/src/main/kotlin/io/spine/dependency/lib/Guava.kt
@@ -37,7 +37,7 @@ package io.spine.dependency.lib
*/
@Suppress("unused", "ConstPropertyName")
object Guava {
- private const val version = "32.1.3-jre"
+ private const val version = "33.4.8-jre"
const val group = "com.google.guava"
const val lib = "$group:guava:$version"
const val testLib = "$group:guava-testlib:$version"
diff --git a/buildSrc/src/main/kotlin/io/spine/dependency/lib/Jackson.kt b/buildSrc/src/main/kotlin/io/spine/dependency/lib/Jackson.kt
index 4b78c8f..b47b0c5 100644
--- a/buildSrc/src/main/kotlin/io/spine/dependency/lib/Jackson.kt
+++ b/buildSrc/src/main/kotlin/io/spine/dependency/lib/Jackson.kt
@@ -26,38 +26,102 @@
package io.spine.dependency.lib
+import io.spine.dependency.Dependency
+import io.spine.dependency.DependencyWithBom
+
// https://github.com/FasterXML/jackson/wiki/Jackson-Releases
-@Suppress("unused", "ConstPropertyName")
-object Jackson {
- const val version = "2.15.3"
- private const val databindVersion = "2.15.3"
+@Suppress("unused")
+object Jackson : DependencyWithBom() {
+ override val group = "com.fasterxml.jackson"
+ override val version = "2.18.3"
+
+ // https://github.com/FasterXML/jackson-bom
+ override val bom = "$group:jackson-bom:$version"
+
+ private val groupPrefix = group
+ private val coreGroup = "$groupPrefix.core"
+ private val moduleGroup = "$groupPrefix.module"
- private const val coreGroup = "com.fasterxml.jackson.core"
- private const val dataformatGroup = "com.fasterxml.jackson.dataformat"
- private const val moduleGroup = "com.fasterxml.jackson.module"
+ // Constants coming below without `$version` are covered by the BOM.
// https://github.com/FasterXML/jackson-core
- const val core = "$coreGroup:jackson-core:$version"
+ val core = "$coreGroup:jackson-core"
+
// https://github.com/FasterXML/jackson-databind
- const val databind = "$coreGroup:jackson-databind:$databindVersion"
- // https://github.com/FasterXML/jackson-annotations
- const val annotations = "$coreGroup:jackson-annotations:$version"
+ val databind = "$coreGroup:jackson-databind"
- // https://github.com/FasterXML/jackson-dataformat-xml/releases
- const val dataformatXml = "$dataformatGroup:jackson-dataformat-xml:$version"
- // https://github.com/FasterXML/jackson-dataformats-text/releases
- const val dataformatYaml = "$dataformatGroup:jackson-dataformat-yaml:$version"
+ // https://github.com/FasterXML/jackson-annotations
+ val annotations = "$coreGroup:jackson-annotations"
// https://github.com/FasterXML/jackson-module-kotlin/releases
- const val moduleKotlin = "$moduleGroup:jackson-module-kotlin:$version"
+ val moduleKotlin = "$moduleGroup:jackson-module-kotlin"
- // https://github.com/FasterXML/jackson-bom
- const val bom = "com.fasterxml.jackson:jackson-bom:$version"
+ override val modules = listOf(
+ core,
+ databind,
+ annotations,
+ moduleKotlin
+ )
+
+ object DataFormat : Dependency() {
+ override val version = Jackson.version
+ override val group = "$groupPrefix.dataformat"
+
+ private const val infix = "jackson-dataformat"
+
+ // https://github.com/FasterXML/jackson-dataformat-xml/releases
+ val xml = "$group:$infix-xml"
+
+ // https://github.com/FasterXML/jackson-dataformats-text/releases
+ val yaml = "$group:$infix-yaml"
+
+ val xmlArtifact = "$xml:$version"
+ val yamlArtifact = "$yaml:$version"
+
+ override val modules = listOf(xml, yaml)
+ }
+
+ object DataType : Dependency() {
+ override val version = Jackson.version
+ override val group = "$groupPrefix.datatype"
+
+ private const val infix = "jackson-datatype"
+
+ // https://github.com/FasterXML/jackson-modules-java8
+ val jdk8 = "$group:$infix-jdk8"
+
+ // https://github.com/FasterXML/jackson-modules-java8/tree/2.19/datetime
+ val dateTime = "$group:$infix-jsr310"
+
+ // https://github.com/FasterXML/jackson-datatypes-collections/blob/2.19/guava
+ val guava = "$group:$infix-guava"
+
+ // https://github.com/FasterXML/jackson-dataformats-binary/tree/2.19/protobuf
+ val protobuf = "$group:$infix-protobuf"
+
+ // https://github.com/FasterXML/jackson-datatypes-misc/tree/2.19/javax-money
+ val javaXMoney = "$group:$infix-javax-money"
+
+ // https://github.com/FasterXML/jackson-datatypes-misc/tree/2.19/moneta
+ val moneta = "$group:jackson-datatype-moneta"
+
+ override val modules = listOf(
+ jdk8,
+ dateTime,
+ guava,
+ protobuf,
+ javaXMoney,
+ moneta
+ )
+ }
// https://github.com/FasterXML/jackson-jr
- object Junior {
- const val version = Jackson.version
- const val group = "com.fasterxml.jackson.jr"
- const val objects = "$group:jackson-jr-objects:$version"
+ object Junior : Dependency() {
+ override val version = Jackson.version
+ override val group = "com.fasterxml.jackson.jr"
+
+ val objects = "$group:jackson-jr-objects"
+
+ override val modules = listOf(objects)
}
}
diff --git a/buildSrc/src/main/kotlin/io/spine/dependency/lib/JavaX.kt b/buildSrc/src/main/kotlin/io/spine/dependency/lib/JavaX.kt
index 7ea8cdf..e605a16 100644
--- a/buildSrc/src/main/kotlin/io/spine/dependency/lib/JavaX.kt
+++ b/buildSrc/src/main/kotlin/io/spine/dependency/lib/JavaX.kt
@@ -29,7 +29,7 @@ package io.spine.dependency.lib
@Suppress("unused", "ConstPropertyName")
object JavaX {
// This artifact, which used to be a part of J2EE, moved under the Eclipse EE4J project.
- // https://github.com/eclipse-ee4j/common-annotations-api
+ // https://github.com/jakartaee/common-annotations-api
const val annotationGroup = "javax.annotation"
const val annotations = "$annotationGroup:javax.annotation-api:1.3.2"
diff --git a/buildSrc/src/main/kotlin/io/spine/dependency/lib/Kotlin.kt b/buildSrc/src/main/kotlin/io/spine/dependency/lib/Kotlin.kt
index 8dabdb8..a40b88c 100644
--- a/buildSrc/src/main/kotlin/io/spine/dependency/lib/Kotlin.kt
+++ b/buildSrc/src/main/kotlin/io/spine/dependency/lib/Kotlin.kt
@@ -26,16 +26,30 @@
package io.spine.dependency.lib
+import io.spine.dependency.Dependency
+import io.spine.dependency.DependencyWithBom
+
// https://github.com/JetBrains/kotlin
// https://github.com/Kotlin
-@Suppress("unused", "ConstPropertyName")
-object Kotlin {
+@Suppress("unused")
+object Kotlin : DependencyWithBom() {
/**
- * When changing the version, also change the version used in the `buildSrc/build.gradle.kts`.
+ * This is the version of Kotlin we use for writing code which does not
+ * depend on Gradle and the version of embedded Kotlin.
*/
@Suppress("MemberVisibilityCanBePrivate") // used directly from the outside.
- const val version = "1.9.24"
+ const val runtimeVersion = "2.1.20"
+
+ override val version = runtimeVersion
+ override val group = "org.jetbrains.kotlin"
+ override val bom = "$group:kotlin-bom:$runtimeVersion"
+
+ /**
+ * This is the version of
+ * [Kotlin embedded into Gradle](https://docs.gradle.org/current/userguide/compatibility.html#kotlin).
+ */
+ const val embeddedVersion = "2.1.20"
/**
* The version of the JetBrains annotations library, which is a transitive
@@ -43,29 +57,64 @@ object Kotlin {
*
* @see Java Annotations
*/
- private const val annotationsVersion = "24.0.1"
+ private const val annotationsVersion = "26.0.2"
+
+ val scriptRuntime = "$group:kotlin-script-runtime:$runtimeVersion"
+
+ object StdLib : Dependency() {
+ override val version = runtimeVersion
+ override val group = Kotlin.group
+
+ private const val infix = "kotlin-stdlib"
+ val itself = "$group:$infix"
+ val common = "$group:$infix-common"
+ val jdk7 = "$group:$infix-jdk7"
+ val jdk8 = "$group:$infix-jdk8"
+
+ override val modules = listOf(itself, common, jdk7, jdk8)
+ }
+
+ @Deprecated("Please use `StdLib.itself` instead.", ReplaceWith("StdLib.itself"))
+ val stdLib = StdLib.itself
+
+ @Deprecated("Please use `StdLib.common` instead.", ReplaceWith("StdLib.common"))
+ val stdLibCommon = StdLib.common
- private const val group = "org.jetbrains.kotlin"
+ @Deprecated("Please use `StdLib.jdk7` instead.", ReplaceWith("StdLib.jdk7"))
+ val stdLibJdk7 = StdLib.jdk7
- const val stdLib = "$group:kotlin-stdlib:$version"
- const val stdLibCommon = "$group:kotlin-stdlib-common:$version"
+ @Deprecated("Please use `StdLib.jdk8` instead.")
+ val stdLibJdk8 = StdLib.jdk8
- @Deprecated("Please use `stdLib` instead.")
- const val stdLibJdk7 = "$group:kotlin-stdlib-jdk7:$version"
+ val toolingCore = "$group:kotlin-tooling-core"
+ val reflect = "$group:kotlin-reflect"
+ val testJUnit5 = "$group:kotlin-test-junit5"
- @Deprecated("Please use `stdLib` instead.")
- const val stdLibJdk8 = "$group:kotlin-stdlib-jdk8:$version"
+ /**
+ * The modules our interest that do not belong to [StdLib].
+ */
+ override val modules = listOf(reflect, testJUnit5)
- const val reflect = "$group:kotlin-reflect:$version"
- const val testJUnit5 = "$group:kotlin-test-junit5:$version"
+ @Deprecated(message = "Please use `GradlePlugin.api` instead.", ReplaceWith("GradlePlugin.api"))
+ val gradlePluginApi = "$group:kotlin-gradle-plugin-api"
- const val gradlePluginApi = "$group:kotlin-gradle-plugin-api:$version"
- const val gradlePluginLib = "$group:kotlin-gradle-plugin:$version"
+ @Deprecated(message = "Please use `GradlePlugin.lib` instead.", ReplaceWith("GradlePlugin.lib"))
+ val gradlePluginLib = "$group:kotlin-gradle-plugin"
const val jetbrainsAnnotations = "org.jetbrains:annotations:$annotationsVersion"
object Compiler {
- const val version = "1.8.22"
- const val embeddable = "$group:kotlin-compiler-embeddable:$version"
+ val embeddable = "$group:kotlin-compiler-embeddable:$embeddedVersion"
+ }
+
+ object GradlePlugin : Dependency() {
+ override val version = runtimeVersion
+ override val group = Kotlin.group
+
+ val api = "$group:kotlin-gradle-plugin-api:$version"
+ val lib = "$group:kotlin-gradle-plugin:$version"
+ val model = "$group:kotlin-gradle-model:$version"
+
+ override val modules = listOf(api, lib, model)
}
}
diff --git a/buildSrc/src/main/kotlin/io/spine/dependency/lib/KotlinSemver.kt b/buildSrc/src/main/kotlin/io/spine/dependency/lib/KotlinSemver.kt
index 1525360..92a348d 100644
--- a/buildSrc/src/main/kotlin/io/spine/dependency/lib/KotlinSemver.kt
+++ b/buildSrc/src/main/kotlin/io/spine/dependency/lib/KotlinSemver.kt
@@ -29,6 +29,6 @@ package io.spine.dependency.lib
// https://github.com/z4kn4fein/kotlin-semver
@Suppress("unused", "ConstPropertyName")
object KotlinSemver {
- private const val version = "1.4.2"
+ private const val version = "2.0.0"
const val lib = "io.github.z4kn4fein:semver:$version"
}
diff --git a/buildSrc/src/main/kotlin/io/spine/dependency/lib/KotlinX.kt b/buildSrc/src/main/kotlin/io/spine/dependency/lib/KotlinX.kt
index 8be6e04..ee521e3 100644
--- a/buildSrc/src/main/kotlin/io/spine/dependency/lib/KotlinX.kt
+++ b/buildSrc/src/main/kotlin/io/spine/dependency/lib/KotlinX.kt
@@ -27,18 +27,34 @@
package io.spine.dependency.lib
@Suppress("unused", "ConstPropertyName")
+@Deprecated(
+ message = "Please use `KotlinX` from `io.spine.dependency.kotlinx` package",
+ replaceWith = ReplaceWith(
+ expression = "KotlinX",
+ imports = ["io.spine.dependency.kotlinx.KotlinX"]
+ )
+)
object KotlinX {
const val group = "org.jetbrains.kotlinx"
+ @Deprecated(
+ message = "Please use `Coroutines` from the `io.spine.dependency.kotlinx` package",
+ replaceWith = ReplaceWith(
+ expression = "Coroutines",
+ imports = ["io.spine.dependency.kotlinx.Coroutines"]
+ )
+ )
object Coroutines {
// https://github.com/Kotlin/kotlinx.coroutines
- const val version = "1.9.0"
- const val bom = "$group:kotlinx-coroutines-bom:$version"
- const val core = "$group:kotlinx-coroutines-core:$version"
- const val coreJvm = "$group:kotlinx-coroutines-core-jvm:$version"
- const val jdk8 = "$group:kotlinx-coroutines-jdk8:$version"
- const val test = "$group:kotlinx-coroutines-test:$version"
+ val version = io.spine.dependency.kotlinx.Coroutines.version
+ val bom = "$group:kotlinx-coroutines-bom:$version"
+ val core = "$group:kotlinx-coroutines-core:$version"
+ val coreJvm = "$group:kotlinx-coroutines-core-jvm:$version"
+ val jdk8 = "$group:kotlinx-coroutines-jdk8:$version"
+ val debug = "$group:kotlinx-coroutines-debug:$version"
+ val test = "$group:kotlinx-coroutines-test:$version"
+ val testJvm = "$group:kotlinx-coroutines-test-jvm:$version"
}
}
diff --git a/buildSrc/src/main/kotlin/io/spine/dependency/lib/Protobuf.kt b/buildSrc/src/main/kotlin/io/spine/dependency/lib/Protobuf.kt
index 98ce188..342d6db 100644
--- a/buildSrc/src/main/kotlin/io/spine/dependency/lib/Protobuf.kt
+++ b/buildSrc/src/main/kotlin/io/spine/dependency/lib/Protobuf.kt
@@ -33,7 +33,7 @@ package io.spine.dependency.lib
)
object Protobuf {
const val group = "com.google.protobuf"
- const val version = "3.25.1"
+ const val version = "3.25.7"
/**
* The Java library with Protobuf data types.
@@ -60,11 +60,11 @@ object Protobuf {
object GradlePlugin {
/**
* The version of this plugin is already specified in `buildSrc/build.gradle.kts` file.
- * Thus, when applying the plugin to projects build files, only the [id] should be used.
+ * Thus, when applying the plugin to project build files, only the [id] should be used.
*
* When changing the version, also change the version used in the `build.gradle.kts`.
*/
- const val version = "0.9.4"
+ const val version = "0.9.5"
const val id = "com.google.protobuf"
const val lib = "$group:protobuf-gradle-plugin:$version"
}
diff --git a/buildSrc/src/main/kotlin/io/spine/dependency/lib/Roaster.kt b/buildSrc/src/main/kotlin/io/spine/dependency/lib/Roaster.kt
index e55420e..601be9a 100644
--- a/buildSrc/src/main/kotlin/io/spine/dependency/lib/Roaster.kt
+++ b/buildSrc/src/main/kotlin/io/spine/dependency/lib/Roaster.kt
@@ -37,7 +37,7 @@ object Roaster {
* [2.29.0.Final](https://github.com/forge/roaster/releases/tag/2.29.0.Final),
* Roaster requires Java 17.
*/
- private const val version = "2.28.0.Final"
+ private const val version = "2.29.0.Final"
const val group = "org.jboss.forge.roaster"
const val api = "$group:roaster-api:$version"
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 25376a3..a026130 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")
object Base {
- const val version = "2.0.0-SNAPSHOT.241"
- const val versionForBuildScript = "2.0.0-SNAPSHOT.241"
+ const val version = "2.0.0-SNAPSHOT.316"
+ const val versionForBuildScript = "2.0.0-SNAPSHOT.316"
const val group = Spine.group
const val artifact = "spine-base"
const val lib = "$group:$artifact:$version"
diff --git a/buildSrc/src/main/kotlin/io/spine/dependency/local/BaseTypes.kt b/buildSrc/src/main/kotlin/io/spine/dependency/local/BaseTypes.kt
index 988cab3..adaaa79 100644
--- a/buildSrc/src/main/kotlin/io/spine/dependency/local/BaseTypes.kt
+++ b/buildSrc/src/main/kotlin/io/spine/dependency/local/BaseTypes.kt
@@ -33,7 +33,7 @@ package io.spine.dependency.local
*/
@Suppress("ConstPropertyName")
object BaseTypes {
- const val version = "2.0.0-SNAPSHOT.126"
+ const val version = "2.0.0-SNAPSHOT.200"
const val group = Spine.group
const val artifact = "spine-base-types"
const val lib = "$group:$artifact:$version"
diff --git a/buildSrc/src/main/kotlin/io/spine/dependency/local/Change.kt b/buildSrc/src/main/kotlin/io/spine/dependency/local/Change.kt
index a5728f7..2436580 100644
--- a/buildSrc/src/main/kotlin/io/spine/dependency/local/Change.kt
+++ b/buildSrc/src/main/kotlin/io/spine/dependency/local/Change.kt
@@ -33,7 +33,7 @@ package io.spine.dependency.local
*/
@Suppress("ConstPropertyName")
object Change {
- const val version = "2.0.0-SNAPSHOT.118"
+ const val version = "2.0.0-SNAPSHOT.200"
const val group = Spine.group
const val artifact = "spine-change"
const val lib = "$group:$artifact:$version"
diff --git a/buildSrc/src/main/kotlin/io/spine/dependency/local/CoreJava.kt b/buildSrc/src/main/kotlin/io/spine/dependency/local/CoreJava.kt
index 01dad32..ba0e7dc 100644
--- a/buildSrc/src/main/kotlin/io/spine/dependency/local/CoreJava.kt
+++ b/buildSrc/src/main/kotlin/io/spine/dependency/local/CoreJava.kt
@@ -34,7 +34,7 @@ package io.spine.dependency.local
@Suppress("ConstPropertyName", "unused")
object CoreJava {
const val group = Spine.group
- const val version = "2.0.0-SNAPSHOT.201"
+ const val version = "2.0.0-SNAPSHOT.301"
const val coreArtifact = "spine-core"
const val clientArtifact = "spine-client"
diff --git a/buildSrc/src/main/kotlin/io/spine/dependency/local/McJava.kt b/buildSrc/src/main/kotlin/io/spine/dependency/local/McJava.kt
index ea96ec7..5327ed4 100644
--- a/buildSrc/src/main/kotlin/io/spine/dependency/local/McJava.kt
+++ b/buildSrc/src/main/kotlin/io/spine/dependency/local/McJava.kt
@@ -26,6 +26,9 @@
package io.spine.dependency.local
+import io.spine.dependency.local.McJava.dogfoodingVersion
+import io.spine.dependency.local.McJava.version
+
/**
* Dependencies on Spine Model Compiler for Java.
*
@@ -42,12 +45,12 @@ object McJava {
/**
* The version used to in the build classpath.
*/
- const val dogfoodingVersion = "2.0.0-SNAPSHOT.262"
+ const val dogfoodingVersion = "2.0.0-SNAPSHOT.310"
/**
* The version to be used for integration tests.
*/
- const val version = "2.0.0-SNAPSHOT.262"
+ const val version = "2.0.0-SNAPSHOT.310"
/**
* The ID of the Gradle plugin.
diff --git a/buildSrc/src/main/kotlin/io/spine/dependency/local/ProtoData.kt b/buildSrc/src/main/kotlin/io/spine/dependency/local/ProtoData.kt
index 67c69e5..813c6e4 100644
--- a/buildSrc/src/main/kotlin/io/spine/dependency/local/ProtoData.kt
+++ b/buildSrc/src/main/kotlin/io/spine/dependency/local/ProtoData.kt
@@ -55,7 +55,6 @@ package io.spine.dependency.local
"unused" /* Some subprojects do not use ProtoData directly. */,
"ConstPropertyName" /* We use custom convention for artifact properties. */,
"MemberVisibilityCanBePrivate" /* The properties are used directly by other subprojects. */,
- "KDocUnresolvedReference" /* Referencing private properties in constructor KDoc. */
)
object ProtoData {
const val pluginGroup = Spine.group
@@ -73,7 +72,7 @@ object ProtoData {
* The version of ProtoData dependencies.
*/
val version: String
- private const val fallbackVersion = "0.91.5"
+ private const val fallbackVersion = "0.94.0"
/**
* The distinct version of ProtoData used by other build tools.
@@ -82,7 +81,7 @@ object ProtoData {
* transitional dependencies, this is the version used to build the project itself.
*/
val dogfoodingVersion: String
- private const val fallbackDfVersion = "0.91.4"
+ private const val fallbackDfVersion = "0.94.0"
/**
* The artifact for the ProtoData Gradle plugin.
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 426099b..c811e58 100644
--- a/buildSrc/src/main/kotlin/io/spine/dependency/local/ProtoTap.kt
+++ b/buildSrc/src/main/kotlin/io/spine/dependency/local/ProtoTap.kt
@@ -38,7 +38,7 @@ package io.spine.dependency.local
)
object ProtoTap {
const val group = "io.spine.tools"
- const val version = "0.8.7"
+ const val version = "0.9.1"
const val gradlePluginId = "io.spine.prototap"
const val api = "$group:prototap-api:$version"
const val gradlePlugin = "$group:prototap-gradle-plugin:$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 e7e6534..1c7a444 100644
--- a/buildSrc/src/main/kotlin/io/spine/dependency/local/TestLib.kt
+++ b/buildSrc/src/main/kotlin/io/spine/dependency/local/TestLib.kt
@@ -33,7 +33,7 @@ package io.spine.dependency.local
*/
@Suppress("ConstPropertyName")
object TestLib {
- const val version = "2.0.0-SNAPSHOT.185"
+ const val version = "2.0.0-SNAPSHOT.202"
const val group = Spine.toolsGroup
const val artifact = "spine-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 56518ec..567cd45 100644
--- a/buildSrc/src/main/kotlin/io/spine/dependency/local/Time.kt
+++ b/buildSrc/src/main/kotlin/io/spine/dependency/local/Time.kt
@@ -33,7 +33,7 @@ package io.spine.dependency.local
*/
@Suppress("ConstPropertyName")
object Time {
- const val version = "2.0.0-SNAPSHOT.136"
+ const val version = "2.0.0-SNAPSHOT.202"
const val group = Spine.group
const val artifact = "spine-time"
const val lib = "$group:$artifact:$version"
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 c91aabe..0213d70 100644
--- a/buildSrc/src/main/kotlin/io/spine/dependency/local/ToolBase.kt
+++ b/buildSrc/src/main/kotlin/io/spine/dependency/local/ToolBase.kt
@@ -34,7 +34,7 @@ package io.spine.dependency.local
@Suppress("ConstPropertyName", "unused")
object ToolBase {
const val group = Spine.toolsGroup
- const val version = "2.0.0-SNAPSHOT.244"
+ const val version = "2.0.0-SNAPSHOT.321"
const val lib = "$group:spine-tool-base:$version"
const val pluginBase = "$group:spine-plugin-base:$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 e702e4b..eddf9ba 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.192"
+ const val version = "2.0.0-SNAPSHOT.332"
const val group = "io.spine.validation"
private const val prefix = "spine-validation"
diff --git a/buildSrc/src/main/kotlin/io/spine/dependency/test/AssertK.kt b/buildSrc/src/main/kotlin/io/spine/dependency/test/AssertK.kt
index b9a554b..760c116 100644
--- a/buildSrc/src/main/kotlin/io/spine/dependency/test/AssertK.kt
+++ b/buildSrc/src/main/kotlin/io/spine/dependency/test/AssertK.kt
@@ -34,6 +34,6 @@ package io.spine.dependency.test
@Deprecated("Please use Kotest assertions instead.")
@Suppress("unused", "ConstPropertyName")
object AssertK {
- private const val version = "0.26.1"
+ private const val version = "0.28.1"
const val libJvm = "com.willowtreeapps.assertk:assertk-jvm:$version"
}
diff --git a/buildSrc/src/main/kotlin/io/spine/dependency/test/Hamcrest.kt b/buildSrc/src/main/kotlin/io/spine/dependency/test/Hamcrest.kt
index c2dcfe2..e540c2c 100644
--- a/buildSrc/src/main/kotlin/io/spine/dependency/test/Hamcrest.kt
+++ b/buildSrc/src/main/kotlin/io/spine/dependency/test/Hamcrest.kt
@@ -35,6 +35,6 @@ package io.spine.dependency.test
@Suppress("unused", "ConstPropertyName")
object Hamcrest {
// https://github.com/hamcrest/JavaHamcrest/releases
- private const val version = "2.2"
+ private const val version = "3.0"
const val core = "org.hamcrest:hamcrest-core:$version"
}
diff --git a/buildSrc/src/main/kotlin/io/spine/dependency/test/JUnit.kt b/buildSrc/src/main/kotlin/io/spine/dependency/test/JUnit.kt
index c410b42..813c7ff 100644
--- a/buildSrc/src/main/kotlin/io/spine/dependency/test/JUnit.kt
+++ b/buildSrc/src/main/kotlin/io/spine/dependency/test/JUnit.kt
@@ -26,39 +26,94 @@
package io.spine.dependency.test
+import io.spine.dependency.Dependency
+import io.spine.dependency.DependencyWithBom
+
// https://junit.org/junit5/
@Suppress("unused", "ConstPropertyName")
-object JUnit {
- const val version = "5.10.0"
+object JUnit : DependencyWithBom() {
+
+ override val version = "5.12.2"
+ override val group: String = "org.junit"
+
+ /**
+ * The BOM of JUnit.
+ *
+ * This one should be forced in a project via:
+ *
+ * ```kotlin
+ * dependencies {
+ * testImplementation(enforcedPlatform(JUnit.bom))
+ * }
+ * ```
+ * The version of JUnit is forced automatically by
+ * the [BomsPlugin][io.spine.dependency.boms.BomsPlugin]
+ * when it is applied to the project.
+ */
+ override val bom = "$group:junit-bom:$version"
+
private const val legacyVersion = "4.13.1"
// https://github.com/apiguardian-team/apiguardian
private const val apiGuardianVersion = "1.1.2"
// https://github.com/junit-pioneer/junit-pioneer
- private const val pioneerVersion = "2.0.1"
+ private const val pioneerVersion = "2.3.0"
+ const val pioneer = "org.junit-pioneer:junit-pioneer:$pioneerVersion"
const val legacy = "junit:junit:$legacyVersion"
+ @Deprecated("Use JUnit.Jupiter.api instead", ReplaceWith("JUnit.Jupiter.api"))
val api = listOf(
"org.apiguardian:apiguardian-api:$apiGuardianVersion",
"org.junit.jupiter:junit-jupiter-api:$version",
"org.junit.jupiter:junit-jupiter-params:$version"
)
- const val bom = "org.junit:junit-bom:$version"
- const val runner = "org.junit.jupiter:junit-jupiter-engine:$version"
- const val params = "org.junit.jupiter:junit-jupiter-params:$version"
+ @Deprecated("Use JUnit.Jupiter.engine instead", ReplaceWith("JUnit.Jupiter.engine"))
+ val runner = "org.junit.jupiter:junit-jupiter-engine:$version"
- const val pioneer = "org.junit-pioneer:junit-pioneer:$pioneerVersion"
+ @Deprecated("Use JUnit.Jupiter.params instead", ReplaceWith("JUnit.Jupiter.params"))
+ val params = "org.junit.jupiter:junit-jupiter-params:$version"
+
+ object Jupiter : Dependency() {
+ override val version = JUnit.version
+ override val group = "org.junit.jupiter"
+ private const val infix = "junit-jupiter"
+
+ // We do not use versions because they are forced via BOM.
+ val api = "$group:$infix-api"
+ val params = "$group:$infix-params"
+ val engine = "$group:$infix-engine"
+
+ @Deprecated("Please use `[Jupiter.run { artifacts[api] }` instead.")
+ val apiArtifact = "$api:$version"
+
+ override val modules = listOf(api, params, engine)
+ }
+
+ /**
+ * The same as [Jupiter.artifacts].
+ */
+ override val modules = Jupiter.modules
+
+ object Platform : Dependency() {
+
+ /**
+ * The version of the platform is defined by JUnit BOM.
+ *
+ * So when we use JUnit as a platform, this property should be picked up
+ * for the dependencies automatically.
+ */
+ override val version: String = "1.12.2"
+ override val group = "org.junit.platform"
+
+ private const val infix = "junit-platform"
+ val commons = "$group:$infix-commons"
+ val launcher = "$group:$infix-launcher"
+ val engine = "$group:$infix-engine"
+ val suiteApi = "$group:$infix-suite-api"
- object Platform {
- // https://junit.org/junit5/
- const val version = "1.10.0"
- internal const val group = "org.junit.platform"
- const val commons = "$group:junit-platform-commons:$version"
- const val launcher = "$group:junit-platform-launcher:$version"
- const val engine = "$group:junit-platform-engine:$version"
- const val suiteApi = "$group:junit-platform-suite-api:$version"
+ override val modules = listOf(commons, launcher, engine, suiteApi)
}
}
diff --git a/buildSrc/src/main/kotlin/io/spine/dependency/test/Jacoco.kt b/buildSrc/src/main/kotlin/io/spine/dependency/test/Jacoco.kt
index b883928..5f007ec 100644
--- a/buildSrc/src/main/kotlin/io/spine/dependency/test/Jacoco.kt
+++ b/buildSrc/src/main/kotlin/io/spine/dependency/test/Jacoco.kt
@@ -33,5 +33,5 @@ package io.spine.dependency.test
*/
@Suppress("ConstPropertyName")
object Jacoco {
- const val version = "0.8.12"
+ const val version = "0.8.13"
}
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 e4e3772..8de10ff 100644
--- a/buildSrc/src/main/kotlin/io/spine/dependency/test/Kotest.kt
+++ b/buildSrc/src/main/kotlin/io/spine/dependency/test/Kotest.kt
@@ -35,7 +35,7 @@ package io.spine.dependency.test
*/
@Suppress("unused", "ConstPropertyName")
object Kotest {
- const val version = "5.8.0"
+ const val version = "5.9.1"
const val group = "io.kotest"
const val assertions = "$group:kotest-assertions-core:$version"
const val runnerJUnit5 = "$group:kotest-runner-junit5:$version"
diff --git a/buildSrc/src/main/kotlin/io/spine/dependency/test/KotlinCompileTesting.kt b/buildSrc/src/main/kotlin/io/spine/dependency/test/KotlinCompileTesting.kt
index d743985..0e9110b 100644
--- a/buildSrc/src/main/kotlin/io/spine/dependency/test/KotlinCompileTesting.kt
+++ b/buildSrc/src/main/kotlin/io/spine/dependency/test/KotlinCompileTesting.kt
@@ -29,12 +29,12 @@ package io.spine.dependency.test
/**
* A library for in-process compilation of Kotlin and Java code compilation.
*
- * @see GitHub repo
+ * @see GitHub repo
*/
@Suppress("unused", "ConstPropertyName")
object KotlinCompileTesting {
- private const val version = "1.5.0" // Compatible with Kotlin Compiler 1.8.22.
- private const val group = "com.github.tschuchortdev"
- const val lib = "$group:kotlin-compile-testing:$version"
- const val libKsp = "$group:kotlin-compile-testing-ksp:$version"
+ private const val version = "0.7.0"
+ private const val group = "dev.zacsweers.kctfork"
+ const val libCore = "$group:core:$version"
+ const val libKsp = "$group:ksp:$version"
}
diff --git a/buildSrc/src/main/kotlin/io/spine/dependency/test/Kover.kt b/buildSrc/src/main/kotlin/io/spine/dependency/test/Kover.kt
index 759e21a..61897cc 100644
--- a/buildSrc/src/main/kotlin/io/spine/dependency/test/Kover.kt
+++ b/buildSrc/src/main/kotlin/io/spine/dependency/test/Kover.kt
@@ -29,7 +29,7 @@ package io.spine.dependency.test
// https://github.com/Kotlin/kotlinx-kover
@Suppress("unused", "ConstPropertyName")
object Kover {
- const val version = "0.7.6"
+ const val version = "0.9.1"
const val id = "org.jetbrains.kotlinx.kover"
const val classpath = "org.jetbrains.kotlinx:kover-gradle-plugin:$version"
}
diff --git a/buildSrc/src/main/kotlin/io/spine/dependency/test/Truth.kt b/buildSrc/src/main/kotlin/io/spine/dependency/test/Truth.kt
index f9af032..cbfb4ad 100644
--- a/buildSrc/src/main/kotlin/io/spine/dependency/test/Truth.kt
+++ b/buildSrc/src/main/kotlin/io/spine/dependency/test/Truth.kt
@@ -29,7 +29,7 @@ package io.spine.dependency.test
// https://github.com/google/truth
@Suppress("unused", "ConstPropertyName")
object Truth {
- private const val version = "1.1.5"
+ private const val version = "1.4.4"
val libs = listOf(
"com.google.truth:truth:$version",
"com.google.truth.extensions:truth-java8-extension:$version",
diff --git a/buildSrc/src/main/kotlin/io/spine/gradle/ProjectExtensions.kt b/buildSrc/src/main/kotlin/io/spine/gradle/ProjectExtensions.kt
index 3b43246..deda203 100644
--- a/buildSrc/src/main/kotlin/io/spine/gradle/ProjectExtensions.kt
+++ b/buildSrc/src/main/kotlin/io/spine/gradle/ProjectExtensions.kt
@@ -40,6 +40,15 @@ 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.
+ */
+fun Project.log(message: () -> String) {
+ if (logger.isInfoEnabled) {
+ logger.info(message.invoke())
+ }
+}
+
/**
* Obtains the Java plugin extension of the project.
*/
@@ -68,7 +77,7 @@ fun Project.applyPlugin(cls: Class>) {
* the generic parameter `T`.
*/
@Suppress("UNCHECKED_CAST") /* See the method docs. */
-fun Project.findTask(name: String): T {
+fun Project.getTask(name: String): T {
val task = this.tasks.findByName(name)
?: error("Unable to find a task named `$name` in the project `${this.name}`.")
return task as T
diff --git a/buildSrc/src/main/kotlin/io/spine/gradle/Repositories.kt b/buildSrc/src/main/kotlin/io/spine/gradle/Repositories.kt
deleted file mode 100644
index 8ec449e..0000000
--- a/buildSrc/src/main/kotlin/io/spine/gradle/Repositories.kt
+++ /dev/null
@@ -1,370 +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.
- */
-
-@file:Suppress("TooManyFunctions") // Deprecated functions will be kept for a while.
-
-package io.spine.gradle
-
-import io.spine.gradle.publish.CloudRepo
-import io.spine.gradle.publish.PublishingRepos
-import io.spine.gradle.publish.PublishingRepos.gitHub
-import java.io.File
-import java.net.URI
-import java.util.*
-import org.gradle.api.Project
-import org.gradle.api.artifacts.dsl.RepositoryHandler
-import org.gradle.api.artifacts.repositories.MavenArtifactRepository
-import org.gradle.kotlin.dsl.ScriptHandlerScope
-import org.gradle.kotlin.dsl.maven
-
-/**
- * Applies [standard][doApplyStandard] repositories to this [ScriptHandlerScope]
- * optionally adding [gitHub] repositories for Spine-only components, if
- * names of such repositories are given.
- *
- * @param buildscript
- * a [ScriptHandlerScope] to work with. Pass `this` under `buildscript { }`.
- * @param rootProject
- * a root project where the `buildscript` is declared.
- * @param gitHubRepo
- * a list of short repository names, or empty list if only
- * [standard repositories][doApplyStandard] are required.
- */
-@Suppress("unused")
-@Deprecated(
- message = "Please use `standardSpineSdkRepositories()`.",
- replaceWith = ReplaceWith("standardSpineSdkRepositories()")
-)
-fun applyWithStandard(
- buildscript: ScriptHandlerScope,
- rootProject: Project,
- vararg gitHubRepo: String
-) {
- val repositories = buildscript.repositories
- gitHubRepo.iterator().forEachRemaining { repo ->
- repositories.applyGitHubPackages(repo, rootProject)
- }
- repositories.standardToSpineSdk()
-}
-
-/**
- * Registers the selected GitHub Packages repos as Maven repositories.
- *
- * To be used in `buildscript` clauses when a fully-qualified call must be made.
- *
- * @param repositories
- * the handler to accept registration of the GitHub Packages repository
- * @param shortRepositoryName
- * the short name of the GitHub repository (e.g. "core-java")
- * @param project
- * the project which is going to consume artifacts from the repository
- * @see applyGitHubPackages
- */
-@Suppress("unused")
-@Deprecated(
- message = "Please use `standardSpineSdkRepositories()`.",
- replaceWith = ReplaceWith("standardSpineSdkRepositories()")
-)
-fun doApplyGitHubPackages(
- repositories: RepositoryHandler,
- shortRepositoryName: String,
- project: Project
-) = repositories.applyGitHubPackages(shortRepositoryName, project)
-
-/**
- * Registers the standard set of Maven repositories.
- *
- * To be used in `buildscript` clauses when a fully-qualified call must be made.
- */
-@Suppress("unused")
-@Deprecated(
- message = "Please use `standardSpineSdkRepositories()`.",
- replaceWith = ReplaceWith("standardSpineSdkRepositories()")
-)
-fun doApplyStandard(repositories: RepositoryHandler) = repositories.standardToSpineSdk()
-
-/**
- * Applies the repository hosted at GitHub Packages, to which Spine artifacts were published.
- *
- * This method should be used by those wishing to have Spine artifacts published
- * to GitHub Packages as dependencies.
- *
- * @param shortRepositoryName
- * short names of the GitHub repository (e.g. "base", "core-java", "model-tools")
- * @param project
- * the project which is going to consume artifacts from repositories
- */
-fun RepositoryHandler.applyGitHubPackages(shortRepositoryName: String, project: Project) {
- val repository = gitHub(shortRepositoryName)
- val credentials = repository.credentials(project)
-
- credentials?.let {
- spineMavenRepo(it, repository.releases)
- spineMavenRepo(it, repository.snapshots)
- }
-}
-
-/**
- * Applies the repositories hosted at GitHub Packages, to which Spine artifacts were published.
- *
- * This method should be used by those wishing to have Spine artifacts published
- * to GitHub Packages as dependencies.
- *
- * @param shortRepositoryName
- * the short name of the GitHub repository (e.g. "core-java")
- * @param project
- * the project which is going to consume or publish artifacts from
- * the registered repository
- */
-fun RepositoryHandler.applyGitHubPackages(project: Project, vararg shortRepositoryName: String) {
- for (name in shortRepositoryName) {
- applyGitHubPackages(name, project)
- }
-}
-
-/**
- * Applies [standard][applyStandard] repositories to this [RepositoryHandler]
- * optionally adding [applyGitHubPackages] repositories for Spine-only components, if
- * names of such repositories are given.
- *
- * @param project
- * a project to which we add dependencies
- * @param gitHubRepo
- * a list of short repository names, or empty list if only
- * [standard repositories][applyStandard] are required.
- */
-@Suppress("unused")
-@Deprecated(
- message = "Please use `standardToSpineSdk()`.",
- replaceWith = ReplaceWith("standardToSpineSdk()")
-)
-fun RepositoryHandler.applyStandardWithGitHub(project: Project, vararg gitHubRepo: String) {
- gitHubRepo.iterator().forEachRemaining { repo ->
- applyGitHubPackages(repo, project)
- }
- standardToSpineSdk()
-}
-
-/**
- * A scrambled version of PAT generated with the only "read:packages" scope.
- *
- * The scrambling around PAT is necessary because GitHub analyzes commits for the presence
- * of tokens and invalidates them.
- *
- * @see
- * How to make GitHub packages to the public
- */
-object Pat {
- private const val shade = "_phg->8YlN->MFRA->gxIk->HVkm->eO6g->FqHJ->z8MS->H4zC->ZEPq"
- private const val separator = "->"
- private val chunks: Int = shade.split(separator).size - 1
-
- fun credentials(): Credentials {
- val pass = shade.replace(separator, "").splitAndReverse(chunks, "")
- return Credentials("public", pass)
- }
-
- /**
- * Splits this string to the chunks, reverses each chunk, and joins them
- * back to a string using the [separator].
- */
- private fun String.splitAndReverse(numChunks: Int, separator: String): String {
- check(length / numChunks >= 2) {
- "The number of chunks is too big. Must be <= ${length / 2}."
- }
- val chunks = chunked(length / numChunks)
- val reversedChunks = chunks.map { chunk -> chunk.reversed() }
- return reversedChunks.joinToString(separator)
- }
-}
-
-/**
- * Adds a read-only view to all artifacts of the SpineEventEngine
- * GitHub organization.
- */
-fun RepositoryHandler.spineArtifacts(): MavenArtifactRepository = maven {
- url = URI("https://maven.pkg.github.com/SpineEventEngine/*")
- includeSpineOnly()
- val pat = Pat.credentials()
- credentials {
- username = pat.username
- password = pat.password
- }
-}
-
-val RepositoryHandler.intellijReleases: MavenArtifactRepository
- get() = maven("https://www.jetbrains.com/intellij-repository/releases")
-
-val RepositoryHandler.jetBrainsCacheRedirector: MavenArtifactRepository
- get() = maven("https://cache-redirector.jetbrains.com/intellij-dependencies")
-
-/**
- * Applies repositories commonly used by Spine Event Engine projects.
- */
-fun RepositoryHandler.standardToSpineSdk() {
- spineArtifacts()
-
- val spineRepos = listOf(
- Repos.spine,
- Repos.spineSnapshots,
- Repos.artifactRegistry,
- Repos.artifactRegistrySnapshots
- )
-
- spineRepos
- .map { URI(it) }
- .forEach {
- maven {
- url = it
- includeSpineOnly()
- }
- }
-
- intellijReleases
- jetBrainsCacheRedirector
-
- maven {
- url = URI(Repos.sonatypeSnapshots)
- }
-
- mavenCentral()
- gradlePluginPortal()
- mavenLocal().includeSpineOnly()
-}
-
-@Deprecated(
- message = "Please use `standardToSpineSdk() instead.",
- replaceWith = ReplaceWith("standardToSpineSdk()")
-)
-fun RepositoryHandler.applyStandard() = this.standardToSpineSdk()
-
-/**
- * A Maven repository.
- */
-data class Repository(
- val releases: String,
- val snapshots: String,
- private val credentialsFile: String? = null,
- private val credentialValues: ((Project) -> Credentials?)? = null,
- val name: String = "Maven repository `$releases`"
-) {
-
- /**
- * Obtains the publishing password credentials to this repository.
- *
- * If the credentials are represented by a `.properties` file, reads the file and parses
- * the credentials. The file must have properties `user.name` and `user.password`, which store
- * the username and the password for the Maven repository auth.
- */
- fun credentials(project: Project): Credentials? = when {
- credentialValues != null -> credentialValues.invoke(project)
- credentialsFile != null -> credsFromFile(credentialsFile, project)
- else -> throw IllegalArgumentException(
- "Credentials file or a supplier function should be passed."
- )
- }
-
- private fun credsFromFile(fileName: String, project: Project): Credentials? {
- val file = project.rootProject.file(fileName)
- if (file.exists().not()) {
- return null
- }
-
- val log = project.logger
- log.info("Using credentials from `$fileName`.")
- val creds = file.parseCredentials()
- log.info("Publishing build as `${creds.username}`.")
- return creds
- }
-
- private fun File.parseCredentials(): Credentials {
- val properties = Properties().apply { load(inputStream()) }
- val username = properties.getProperty("user.name")
- val password = properties.getProperty("user.password")
- return Credentials(username, password)
- }
-
- override fun toString(): String {
- return name
- }
-}
-
-/**
- * Password credentials for a Maven repository.
- */
-data class Credentials(
- val username: String?,
- val password: String?
-)
-
-/**
- * Defines names of additional repositories commonly used in the Spine SDK projects.
- *
- * @see [applyStandard]
- */
-private object Repos {
- val spine = CloudRepo.published.releases
- val spineSnapshots = CloudRepo.published.snapshots
- val artifactRegistry = PublishingRepos.cloudArtifactRegistry.releases
- val artifactRegistrySnapshots = PublishingRepos.cloudArtifactRegistry.snapshots
-
- @Suppress("unused")
- @Deprecated(
- message = "Sonatype release repository redirects to the Maven Central",
- replaceWith = ReplaceWith("sonatypeSnapshots"),
- level = DeprecationLevel.ERROR
- )
- const val sonatypeReleases = "https://oss.sonatype.org/content/repositories/snapshots"
- const val sonatypeSnapshots = "https://oss.sonatype.org/content/repositories/snapshots"
-}
-
-/**
- * Registers the Maven repository with the passed [repoCredentials] for authorization.
- *
- * Only includes the Spine-related artifact groups.
- */
-private fun RepositoryHandler.spineMavenRepo(
- repoCredentials: Credentials,
- repoUrl: String
-) {
- maven {
- url = URI(repoUrl)
- includeSpineOnly()
- credentials {
- username = repoCredentials.username
- password = repoCredentials.password
- }
- }
-}
-
-/**
- * Narrows down the search for this repository to Spine-related artifact groups.
- */
-private fun MavenArtifactRepository.includeSpineOnly() {
- content {
- includeGroupByRegex("io\\.spine.*")
- }
-}
diff --git a/buildSrc/src/main/kotlin/io/spine/gradle/RunBuild.kt b/buildSrc/src/main/kotlin/io/spine/gradle/RunBuild.kt
index 60a7207..aa2759d 100644
--- a/buildSrc/src/main/kotlin/io/spine/gradle/RunBuild.kt
+++ b/buildSrc/src/main/kotlin/io/spine/gradle/RunBuild.kt
@@ -32,6 +32,6 @@ package io.spine.gradle
open class RunBuild : RunGradle() {
init {
- task("build")
+ task("clean", "build")
}
}
diff --git a/buildSrc/src/main/kotlin/io/spine/gradle/RunGradle.kt b/buildSrc/src/main/kotlin/io/spine/gradle/RunGradle.kt
index c1b883a..8942630 100644
--- a/buildSrc/src/main/kotlin/io/spine/gradle/RunGradle.kt
+++ b/buildSrc/src/main/kotlin/io/spine/gradle/RunGradle.kt
@@ -100,7 +100,7 @@ open class RunGradle : DefaultTask() {
}
@TaskAction
- private fun execute() {
+ public fun execute() {
// Ensure build error output log.
// Since we're executing this task in another process, we redirect error output to
// the file under the `_out` directory. Using the `build` directory for this purpose
diff --git a/buildSrc/src/main/kotlin/io/spine/gradle/checkstyle/CheckStyleConfig.kt b/buildSrc/src/main/kotlin/io/spine/gradle/checkstyle/CheckStyleConfig.kt
index ab67ffe..122a604 100644
--- a/buildSrc/src/main/kotlin/io/spine/gradle/checkstyle/CheckStyleConfig.kt
+++ b/buildSrc/src/main/kotlin/io/spine/gradle/checkstyle/CheckStyleConfig.kt
@@ -28,7 +28,6 @@ package io.spine.gradle.checkstyle
import io.spine.dependency.build.CheckStyle
import org.gradle.api.Project
-import org.gradle.api.plugins.quality.Checkstyle
import org.gradle.api.plugins.quality.CheckstyleExtension
import org.gradle.api.plugins.quality.CheckstylePlugin
import org.gradle.kotlin.dsl.the
@@ -65,9 +64,13 @@ object CheckStyleConfig {
}
project.afterEvaluate {
- // Disables checking the test sources.
- val checkstyleTest = project.tasks.findByName("checkstyleTest") as Checkstyle
- checkstyleTest.enabled = false
+ // Disables checking the test sources and test fixtures.
+ arrayOf(
+ "checkstyleTest",
+ "checkstyleTestFixtures"
+ ).forEach {
+ task -> tasks.findByName(task)?.enabled = false
+ }
}
}
}
diff --git a/buildSrc/src/main/kotlin/io/spine/gradle/github/pages/RepositoryExtensions.kt b/buildSrc/src/main/kotlin/io/spine/gradle/github/pages/RepositoryExtensions.kt
index 94ab6ac..ef67c71 100644
--- a/buildSrc/src/main/kotlin/io/spine/gradle/github/pages/RepositoryExtensions.kt
+++ b/buildSrc/src/main/kotlin/io/spine/gradle/github/pages/RepositoryExtensions.kt
@@ -26,10 +26,10 @@
package io.spine.gradle.github.pages
-import io.spine.gradle.RepoSlug
import io.spine.gradle.git.Branch
import io.spine.gradle.git.Repository
import io.spine.gradle.git.UserInfo
+import io.spine.gradle.repo.RepoSlug
/**
* Clones the current project repository with the branch dedicated to publishing
diff --git a/buildSrc/src/main/kotlin/io/spine/gradle/javac/ErrorProne.kt b/buildSrc/src/main/kotlin/io/spine/gradle/javac/ErrorProne.kt
index 34d14fc..84c6bcb 100644
--- a/buildSrc/src/main/kotlin/io/spine/gradle/javac/ErrorProne.kt
+++ b/buildSrc/src/main/kotlin/io/spine/gradle/javac/ErrorProne.kt
@@ -51,6 +51,7 @@ import org.gradle.process.CommandLineArgumentProvider
*/
@Suppress("unused")
fun JavaCompile.configureErrorProne() {
+ options.compilerArgs.add("--should-stop=ifError=FLOW")
options.errorprone
.errorproneArgumentProviders
.add(ErrorProneConfig.ARGUMENTS)
diff --git a/buildSrc/src/main/kotlin/io/spine/gradle/javadoc/JavadocConfig.kt b/buildSrc/src/main/kotlin/io/spine/gradle/javadoc/JavadocConfig.kt
index d2e4c90..9616e99 100644
--- a/buildSrc/src/main/kotlin/io/spine/gradle/javadoc/JavadocConfig.kt
+++ b/buildSrc/src/main/kotlin/io/spine/gradle/javadoc/JavadocConfig.kt
@@ -26,11 +26,24 @@
package io.spine.gradle.javadoc
+import io.spine.gradle.javadoc.JavadocConfig.tags
import java.io.File
import org.gradle.api.JavaVersion
import org.gradle.api.Project
+import org.gradle.api.tasks.TaskContainer
import org.gradle.api.tasks.javadoc.Javadoc
import org.gradle.external.javadoc.StandardJavadocDocletOptions
+import productionModules
+
+/**
+ * Finds a [Javadoc] Gradle task by the passed name.
+ */
+fun TaskContainer.javadocTask(named: String) = this.getByName(named) as Javadoc
+
+/**
+ * Finds a default [Javadoc] Gradle task.
+ */
+fun TaskContainer.javadocTask() = this.getByName("javadoc") as Javadoc
/**
* Javadoc processing settings.
@@ -58,17 +71,25 @@ object JavadocConfig {
fun applyTo(project: Project) {
val javadocTask = project.tasks.javadocTask()
+ if (!isProductionModule(project)) {
+ javadocTask.enabled = false
+ return
+ }
discardJavaModulesInLinks(javadocTask)
val docletOptions = javadocTask.options as StandardJavadocDocletOptions
configureDoclet(docletOptions)
}
+ private fun isProductionModule(project: Project) = project.run {
+ rootProject.productionModules.contains(this)
+ }
+
/**
- * Discards using of Java 9 modules in URL links generated by javadoc for our codebase.
+ * Discards using of Java 9 modules in URL links generated by Javadoc for our codebase.
*
* This fixes navigation to classes through the search results.
*
- * The issue appeared after migration to Java 11. When javadoc is generated for a project
+ * The issue appeared after migration to Java 11. When Javadoc is generated for a project
* that does not declare Java 9 modules, search results contain broken links with appended
* `undefined` prefix to the URL. This `undefined` was meant to be a name of a Java 9 module.
*
@@ -78,9 +99,9 @@ object JavadocConfig {
// We ask `Javadoc` task to modify "search.js" and override a method, responsible for
// the formation of URL prefixes. We can't specify the option "--no-module-directories",
- // because it leads to discarding of all module prefixes in generated links. That means,
- // links to the types from the standard library would not work, as they are declared
- // within modules since Java 9.
+ // because it leads to discarding of all module prefixes in generated links.
+ // That means links to the types from the standard library would not work,
+ // as they are declared within modules since Java 9.
val discardModulePrefix = """
diff --git a/buildSrc/src/main/kotlin/io/spine/gradle/javascript/JsContext.kt b/buildSrc/src/main/kotlin/io/spine/gradle/javascript/JsContext.kt
index 82197eb..ec5d872 100644
--- a/buildSrc/src/main/kotlin/io/spine/gradle/javascript/JsContext.kt
+++ b/buildSrc/src/main/kotlin/io/spine/gradle/javascript/JsContext.kt
@@ -27,11 +27,9 @@
package io.spine.gradle.javascript
import java.io.File
-import kotlin.collections.set
import org.gradle.api.Project
import org.gradle.kotlin.dsl.support.serviceOf
import org.gradle.process.ExecOperations
-import org.gradle.process.ExecResult
/**
* Provides access to the current [JsEnvironment] and shortcuts for running `npm` tool.
@@ -51,18 +49,14 @@ open class JsContext(jsEnv: JsEnvironment, internal val project: Project)
*
* This [File] is used as a working directory.
*/
- fun File.npm(vararg args: String): ExecResult {
- val execOperations = project.serviceOf()
- return execOperations.exec {
+ fun File.npm(vararg args: String) = project.serviceOf().exec {
+ workingDir(this@npm)
+ commandLine(npmExecutable)
+ args(*args)
- workingDir(this@npm)
- commandLine(npmExecutable)
- args(*args)
+ // Using private packages in a CI/CD workflow | npm Docs
+ // https://docs.npmjs.com/using-private-packages-in-a-ci-cd-workflow
- // Using private packages in a CI/CD workflow | npm Docs
- // https://docs.npmjs.com/using-private-packages-in-a-ci-cd-workflow
-
- environment["NPM_TOKEN"] = npmAuthToken
- }
+ environment["NPM_TOKEN"] = npmAuthToken
}
}
diff --git a/buildSrc/src/main/kotlin/io/spine/gradle/kotlin/KotlinConfig.kt b/buildSrc/src/main/kotlin/io/spine/gradle/kotlin/KotlinConfig.kt
index 0b4cc72..65cdebd 100644
--- a/buildSrc/src/main/kotlin/io/spine/gradle/kotlin/KotlinConfig.kt
+++ b/buildSrc/src/main/kotlin/io/spine/gradle/kotlin/KotlinConfig.kt
@@ -27,12 +27,12 @@
package io.spine.gradle.kotlin
import org.gradle.jvm.toolchain.JavaLanguageVersion
+import org.jetbrains.kotlin.gradle.dsl.KotlinJvmCompilerOptions
import org.jetbrains.kotlin.gradle.dsl.KotlinJvmProjectExtension
-import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
/**
* Sets [Java toolchain](https://kotlinlang.org/docs/gradle.html#gradle-java-toolchains-support)
- * to the specified version (e.g. 11 or 8).
+ * to the specified version (e.g., 11 or 8).
*/
fun KotlinJvmProjectExtension.applyJvmToolchain(version: Int) {
jvmToolchain {
@@ -51,26 +51,19 @@ fun KotlinJvmProjectExtension.applyJvmToolchain(version: String) =
/**
* Opts-in to experimental features that we use in our codebase.
*/
-@Suppress("unused", "MagicNumber" /* Kotlin Compiler version. */)
-fun KotlinCompile.setFreeCompilerArgs() {
- // Avoid the "unsupported flag warning" for Kotlin compilers pre 1.9.20 and after 2.0.0.
- // See: https://youtrack.jetbrains.com/issue/KT-61573
- val expectActualClasses = KotlinVersion.CURRENT.run {
- if (isAtLeast(1, 9, 20) && major < 2) "-Xexpect-actual-classes"
- else ""
- }
- kotlinOptions {
- freeCompilerArgs = listOf(
+@Suppress("unused")
+fun KotlinJvmCompilerOptions.setFreeCompilerArgs() {
+ freeCompilerArgs.addAll(
+ listOf(
"-Xskip-prerelease-check",
"-Xjvm-default=all",
"-Xinline-classes",
- expectActualClasses,
"-opt-in=" +
"kotlin.contracts.ExperimentalContracts," +
"kotlin.io.path.ExperimentalPathApi," +
"kotlin.ExperimentalUnsignedTypes," +
"kotlin.ExperimentalStdlibApi," +
"kotlin.experimental.ExperimentalTypeInference",
- ).filter { it.isNotBlank() }
- }
+ )
+ )
}
diff --git a/buildSrc/src/main/kotlin/io/spine/gradle/protobuf/ProtoTaskExtensions.kt b/buildSrc/src/main/kotlin/io/spine/gradle/protobuf/ProtoTaskExtensions.kt
index 6ffcba9..4e2e24a 100644
--- a/buildSrc/src/main/kotlin/io/spine/gradle/protobuf/ProtoTaskExtensions.kt
+++ b/buildSrc/src/main/kotlin/io/spine/gradle/protobuf/ProtoTaskExtensions.kt
@@ -24,6 +24,9 @@
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
+@file:Suppress("unused", "UnusedReceiverParameter") /* Extensions declared in this file
+ are used in the modules that build proto files without using the Spine Compiler. */
+
package io.spine.gradle.protobuf
import com.google.protobuf.gradle.GenerateProtoTask
@@ -34,6 +37,7 @@ import java.nio.file.Files
import java.nio.file.Path
import java.nio.file.Paths
import java.nio.file.StandardOpenOption.TRUNCATE_EXISTING
+import kotlin.io.path.Path
import org.gradle.api.Project
import org.gradle.api.file.SourceDirectorySet
import org.gradle.api.tasks.SourceSet
@@ -42,7 +46,7 @@ import org.gradle.kotlin.dsl.getByType
import org.gradle.plugins.ide.idea.GenerateIdeaModule
import org.gradle.plugins.ide.idea.model.IdeaModel
import org.gradle.plugins.ide.idea.model.IdeaModule
-import org.jetbrains.kotlin.gradle.dsl.KotlinCompile
+import org.jetbrains.kotlin.gradle.tasks.KotlinCompilationTask
import titleCaseFirstChar
/**
@@ -105,10 +109,12 @@ private fun GenerateProtoTask.generatedDir(language: String = ""): File {
fun GenerateProtoTask.setup() {
builtins.maybeCreate("kotlin")
setupDescriptorSetFileCreation()
+ doFirst {
+ excludeProtocOutput()
+ }
doLast {
copyGeneratedFiles()
}
- excludeProtocOutput()
setupKotlinCompile()
dependOnProcessResourcesTask()
makeDirsForIdeaModule()
@@ -245,7 +251,7 @@ fun GenerateProtoTask.excludeProtocOutput() {
* Make sure Kotlin compilation explicitly depends on this `GenerateProtoTask` to avoid racing.
*/
fun GenerateProtoTask.setupKotlinCompile() {
- val kotlinCompile = project.kotlinCompileFor(sourceSet)
+ val kotlinCompile = project.kotlinCompilationTaskFor(sourceSet)
kotlinCompile?.dependsOn(this)
}
@@ -273,16 +279,9 @@ private fun processResourceTaskName(sourceSetName: String): String {
return "process${infix}Resources"
}
-/**
- * Attempts to obtain the Kotlin compilation Gradle task for the given source set.
- *
- * Typically, the task is named by a pattern: `compileKotlin`, or just
- * `compileKotlin` if the source set name is `"main"`. If the task does not fit this described
- * pattern, this method will not find it.
- */
-private fun Project.kotlinCompileFor(sourceSet: SourceSet): KotlinCompile<*>? {
+private fun Project.kotlinCompilationTaskFor(sourceSet: SourceSet): KotlinCompilationTask<*>? {
val taskName = sourceSet.getCompileTaskName("Kotlin")
- return tasks.findByName(taskName) as KotlinCompile<*>?
+ return tasks.named(taskName, KotlinCompilationTask::class.java).orNull
}
private fun File.residesIn(directory: File): Boolean =
@@ -332,18 +331,42 @@ fun IdeaModule.printSourceDirectories() {
excludeDirs.forEach { println(it) }
}
+/**
+ * Obtains the extension of Protobuf Gradle Plugin in the given project.
+ */
+val Project.protobufExtension: ProtobufExtension?
+ get() = extensions.findByType(ProtobufExtension::class.java)
+
/**
* Obtains the directory where the Protobuf Gradle Plugin should place the generated code.
*
- * The directory is fixed to be `$buildDir/generated/source/proto` and cannot be
- * changed by the settings of the plugin. Even though [ProtobufExtension] has a property
+ * The directory is fixed to be `$buildDir/generated/source/proto` in versions pre v0.9.5
+ * and cannot be changed by the settings of the plugin.
+ * In the v0.9.5 the path was changed to
+ * [`$buildDir/generated/sources/proto`](https://github.com/google/protobuf-gradle-plugin/releases/tag/v0.9.5).
+ *
+ * Even though [ProtobufExtension] has a property
* [generatedFilesBaseDir][ProtobufExtension.getGeneratedFilesBaseDir], which is supposed
- * to be used for this purpose, it is declared with `@PackageScope` and thus cannot be
- * accessed from outside the plugin. The Protobuf Gradle Plugin (at v0.9.2) does not
- * modify the value of the property either.
+ * to be used for this purpose, it is declared with `@PackageScope` (again in earlier versions)
+ * and thus cannot be accessed from outside the plugin.
+ * The Protobuf Gradle Plugin (at v0.9.2) does not modify the value of the property either.
+ * Therefore, we try getting the path using the newer version API and resort to the "legacy"
+ * convention if the call fails.
*/
val Project.generatedSourceProtoDir: Path
- get() = layout.buildDirectory.dir("generated/source/proto").get().asFile.toPath()
+ get() {
+ val legacyPath = layout.buildDirectory.dir("generated/source/proto").get().asFile.toPath()
+ protobufExtension?.let {
+ return try {
+ it.generatedFilesBaseDir.let { Path(it) }
+ } catch (_: Throwable) {
+ // Probably we're running on an older version of the Protobuf Gradle Plugin
+ // which has `package-access` for the `getGeneratedFilesDir()` method.
+ legacyPath
+ }
+ }
+ return legacyPath
+ }
/**
* Ensures that the sources generated by Protobuf Gradle Plugin
diff --git a/buildSrc/src/main/kotlin/io/spine/gradle/publish/CheckVersionIncrement.kt b/buildSrc/src/main/kotlin/io/spine/gradle/publish/CheckVersionIncrement.kt
index 9e38068..56245ff 100644
--- a/buildSrc/src/main/kotlin/io/spine/gradle/publish/CheckVersionIncrement.kt
+++ b/buildSrc/src/main/kotlin/io/spine/gradle/publish/CheckVersionIncrement.kt
@@ -28,7 +28,7 @@ package io.spine.gradle.publish
import com.fasterxml.jackson.databind.DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES
import com.fasterxml.jackson.dataformat.xml.XmlMapper
-import io.spine.gradle.Repository
+import io.spine.gradle.repo.Repository
import java.io.FileNotFoundException
import java.net.URL
import org.gradle.api.DefaultTask
@@ -58,10 +58,11 @@ open class CheckVersionIncrement : DefaultTask() {
@TaskAction
fun fetchAndCheck() {
val artifact = "${project.artifactPath()}/${MavenMetadata.FILE_NAME}"
- checkInRepo(repository.snapshots, artifact)
+ val snapshots = repository.target(snapshots = true)
+ checkInRepo(snapshots, artifact)
- if (repository.releases != repository.snapshots) {
- checkInRepo(repository.releases, artifact)
+ if (!repository.hasOneTarget()) {
+ checkInRepo(repository.target(snapshots = false), artifact)
}
}
@@ -135,7 +136,7 @@ private data class MavenMetadata(var versioning: Versioning = Versioning()) {
return try {
val metadata = mapper.readValue(url, MavenMetadata::class.java)
metadata
- } catch (ignored: FileNotFoundException) {
+ } catch (_: FileNotFoundException) {
null
}
}
diff --git a/buildSrc/src/main/kotlin/io/spine/gradle/publish/CloudArtifactRegistry.kt b/buildSrc/src/main/kotlin/io/spine/gradle/publish/CloudArtifactRegistry.kt
index 1cfa7c2..67716d8 100644
--- a/buildSrc/src/main/kotlin/io/spine/gradle/publish/CloudArtifactRegistry.kt
+++ b/buildSrc/src/main/kotlin/io/spine/gradle/publish/CloudArtifactRegistry.kt
@@ -28,8 +28,8 @@ package io.spine.gradle.publish
import com.google.auth.oauth2.GoogleCredentials
import com.google.cloud.artifactregistry.auth.DefaultCredentialProvider
-import io.spine.gradle.Credentials
-import io.spine.gradle.Repository
+import io.spine.gradle.repo.Credentials
+import io.spine.gradle.repo.Repository
import java.io.IOException
import org.gradle.api.Project
@@ -51,13 +51,15 @@ import org.gradle.api.Project
* Ordering said hooks is a non-trivial operation and the result is usually quite fragile.
* Thus, we choose to do this small piece of configuration manually.
*/
+@Suppress("ConstPropertyName") // https://bit.ly/kotlin-prop-names
internal object CloudArtifactRegistry {
private const val spineRepoLocation = "https://europe-maven.pkg.dev/spine-event-engine"
val repository = Repository(
- releases = "${spineRepoLocation}/releases",
- snapshots = "${spineRepoLocation}/snapshots",
+ name = "CloudArtifactRegistry",
+ releases = "$spineRepoLocation/releases",
+ snapshots = "$spineRepoLocation/snapshots",
credentialValues = this::fetchGoogleCredentials
)
diff --git a/buildSrc/src/main/kotlin/io/spine/gradle/publish/CloudRepo.kt b/buildSrc/src/main/kotlin/io/spine/gradle/publish/CloudRepo.kt
index 7db15aa..624f5cb 100644
--- a/buildSrc/src/main/kotlin/io/spine/gradle/publish/CloudRepo.kt
+++ b/buildSrc/src/main/kotlin/io/spine/gradle/publish/CloudRepo.kt
@@ -26,15 +26,16 @@
package io.spine.gradle.publish
-import io.spine.gradle.Repository
+import io.spine.gradle.repo.Repository
/**
* CloudRepo Maven repository.
*
* There is a special treatment for this repository. Usually, fetching and publishing of artifacts
* is performed via the same URL. But it is not true for CloudRepo. Fetching is performed via
- * the public repository, and publishing via the private one. Their URLs differ in `/public` infix.
+ * the public repository and publishing via the private one. Their URLs differ in `/public` infix.
*/
+@Deprecated(message = "Please use `PublishingRepos.cloudArtifactRegistry` instead.")
internal object CloudRepo {
private const val name = "CloudRepo"
diff --git a/buildSrc/src/main/kotlin/io/spine/gradle/publish/CustomPublicationHandler.kt b/buildSrc/src/main/kotlin/io/spine/gradle/publish/CustomPublicationHandler.kt
new file mode 100644
index 0000000..152455d
--- /dev/null
+++ b/buildSrc/src/main/kotlin/io/spine/gradle/publish/CustomPublicationHandler.kt
@@ -0,0 +1,70 @@
+/*
+ * 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.gradle.publish
+
+import io.spine.gradle.repo.Repository
+import org.gradle.api.Project
+import org.gradle.api.publish.maven.MavenPublication
+
+/**
+ * A handler for custom publications, which are declared under the [publications]
+ * section of a module.
+ *
+ * Such publications should be treated differently than [StandardJavaPublicationHandler],
+ * which is created for a module. Instead, since the publications are already declared,
+ * this class only [assigns Maven coordinates][copyProjectAttributes].
+ *
+ * A module which declares custom publications must be specified in
+ * the [SpinePublishing.modulesWithCustomPublishing] property.
+ *
+ * If a module with [publications] declared locally is not specified as one with custom publishing,
+ * it may cause a name clash between an artifact produced by
+ * the [standard][org.gradle.api.publish.maven.MavenPublication] publication, and custom ones.
+ * To have both standard and custom publications, please specify custom artifact IDs or
+ * classifiers for each custom publication.
+ *
+ * @see StandardJavaPublicationHandler
+ */
+internal class CustomPublicationHandler private constructor(
+ project: Project,
+ destinations: Set
+) : PublicationHandler(project, destinations) {
+
+ override fun handlePublications() {
+ project.publications.forEach {
+ (it as MavenPublication).copyProjectAttributes()
+ }
+ }
+
+ companion object : HandlerFactory() {
+ override fun create(
+ project: Project,
+ destinations: Set,
+ vararg params: Any
+ ): CustomPublicationHandler = CustomPublicationHandler(project, destinations)
+ }
+}
diff --git a/buildSrc/src/main/kotlin/io/spine/gradle/publish/GitHubPackages.kt b/buildSrc/src/main/kotlin/io/spine/gradle/publish/GitHubPackages.kt
index 1072139..df326b8 100644
--- a/buildSrc/src/main/kotlin/io/spine/gradle/publish/GitHubPackages.kt
+++ b/buildSrc/src/main/kotlin/io/spine/gradle/publish/GitHubPackages.kt
@@ -26,8 +26,8 @@
package io.spine.gradle.publish
-import io.spine.gradle.Credentials
-import io.spine.gradle.Repository
+import io.spine.gradle.repo.Credentials
+import io.spine.gradle.repo.Repository
import io.spine.gradle.buildDirectory
import net.lingala.zip4j.ZipFile
import org.gradle.api.Project
@@ -42,12 +42,12 @@ internal object GitHubPackages {
*/
fun repository(repoName: String): Repository {
val githubActor: String = actor()
+ val url = "https://maven.pkg.github.com/SpineEventEngine/$repoName"
return Repository(
- name = "GitHub Packages",
- releases = "https://maven.pkg.github.com/SpineEventEngine/$repoName",
- snapshots = "https://maven.pkg.github.com/SpineEventEngine/$repoName",
- credentialValues = { project -> project.credentialsWithToken(githubActor) }
- )
+ name = "GitHub-Packages",
+ releases = url,
+ snapshots = url
+ ) { project -> project.credentialsWithToken(githubActor) }
}
private fun actor(): String {
diff --git a/buildSrc/src/main/kotlin/io/spine/gradle/publish/PublicationHandler.kt b/buildSrc/src/main/kotlin/io/spine/gradle/publish/PublicationHandler.kt
new file mode 100644
index 0000000..75c5413
--- /dev/null
+++ b/buildSrc/src/main/kotlin/io/spine/gradle/publish/PublicationHandler.kt
@@ -0,0 +1,250 @@
+/*
+ * 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.gradle.publish
+
+import LicenseSettings
+import io.spine.gradle.isSnapshot
+import io.spine.gradle.repo.Repository
+import org.gradle.api.Project
+import org.gradle.api.artifacts.dsl.RepositoryHandler
+import org.gradle.api.invocation.BuildInvocationDetails
+import org.gradle.api.publish.maven.MavenPublication
+import org.gradle.kotlin.dsl.apply
+import org.gradle.kotlin.dsl.support.serviceOf
+
+/**
+ * The name of the Maven Publishing Gradle plugin.
+ */
+private const val MAVEN_PUBLISH = "maven-publish"
+
+/**
+ * Abstract base for handlers of publications in a project
+ * with [spinePublishing] settings declared.
+ *
+ * @param project The project to which the handler is applied.
+ * @param destinations The repositories for publishing artifacts of this project.
+ * In a multi-module project the destinations can be re-defined by
+ * specifying custom values in
+ * the [`spinePublishing`][io.spine.gradle.publish.SpinePublishing.destinations]
+ * extension applied to the subproject.
+ */
+internal sealed class PublicationHandler(
+ protected val project: Project,
+ protected var destinations: Set
+) {
+ /**
+ * Remembers if the [apply] function was called by this handler.
+ */
+ private var applied: Boolean = false
+
+ /**
+ * Overwrites the [destinations] property with the given set.
+ */
+ fun publishTo(alternativeDestinations: Set) {
+ if (alternativeDestinations.isEmpty()) {
+ project.logger.info(
+ "The project ${project.path} is not going to be published because" +
+ " the publication handler `${this@PublicationHandler}`" +
+ " got an empty set of new `destinations`."
+ )
+ }
+ destinations = alternativeDestinations
+ }
+
+ /**
+ * Configures the publication of the associated [project].
+ */
+ fun apply() {
+ synchronized(project) {
+ if (applied) {
+ return
+ }
+ project.run {
+ // We apply the `maven-publish` plugin for modules with standard
+ // publishing automatically because they don't need custom DSL
+ // in their `build.gradle.kts` files.
+ // All the job is done by the `SpinePublishing` extension and
+ // `StandardPublicationHandler` instance associated with this project.
+ if (!hasCustomPublishing) {
+ apply(plugin = MAVEN_PUBLISH)
+ }
+ // And we do not apply the plugin for modules with custom publishing
+ // because they will need the `maven-publish` DSL to tune the publishing.
+ // Therefore, we only arrange the execution of our code when the plugin
+ // is applied.
+ pluginManager.withPlugin(MAVEN_PUBLISH) {
+ handlePublications()
+ registerDestinations()
+ configurePublishTask(destinations)
+ applied = true
+ }
+ }
+ }
+ }
+
+ /**
+ * Either handles publications already declared in the associated [project]
+ * or creates new ones.
+ */
+ abstract fun handlePublications()
+
+ /**
+ * Goes through the [destinations] and registers each as a repository for publishing
+ * in the given Gradle project.
+ */
+ private fun registerDestinations() {
+ val repositories = project.publishingExtension.repositories
+ destinations.forEach { destination ->
+ repositories.register(project, destination)
+ }
+ }
+
+ /**
+ * Copies the attributes of Gradle [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.
+ *
+ * Finally, the Apache Software License 2.0 is set as the only license
+ * under which the published artifact is distributed.
+ */
+ protected fun MavenPublication.copyProjectAttributes() {
+ groupId = project.group.toString()
+ val prefix = project.spinePublishing.artifactPrefix
+ if (!artifactId.startsWith(prefix)) {
+ artifactId = prefix + artifactId
+ }
+ version = project.version.toString()
+ pom.description.set(project.description)
+
+ pom.licenses {
+ license {
+ name.set(LicenseSettings.name)
+ url.set(LicenseSettings.url)
+ }
+ }
+ }
+
+ /**
+ * The abstract base for factories producing instances of classes
+ * derived from [io.spine.gradle.publish.PublicationHandler].
+ *
+ * The factory maintains associations between a path of the project to
+ * its publication handler.
+ *
+ * If the handler already exists, its settings are updated when
+ * the [serving] factory method is called.
+ *
+ * Otherwise, a new handler is created and associated with the project.
+ *
+ * @param H The type of the publication handlers produced by this repository.
+ * @see serving
+ */
+ abstract class HandlerFactory {
+
+ /**
+ * Maps a project path suffixed with build start time to the associated publication handler.
+ *
+ * The suffix after the project path is needed to create a new handler
+ * for each build. We do not use Guava or other cache expecting the small amount
+ * of memory consumption of each publication handler.
+ */
+ private val handlers = mutableMapOf()
+
+ /**
+ * Computes the key for a publication handler taking the [project] and
+ * its build start time.
+ */
+ private fun createKey(project: Project): String {
+ val buildService = project.gradle.serviceOf()
+ val buildStartedMillis = buildService.buildStartedTime
+ val localTime = java.time.Instant.ofEpochMilli(buildStartedMillis)
+ val key = "${project.path}-at-$localTime"
+ return key
+ }
+
+ /**
+ * Obtains an instance of [PublicationHandler] for the given project.
+ *
+ * If the handler for the given [project] was already created, the handler
+ * gets new [destinations], [overwriting][publishTo] previously specified.
+ *
+ * @return the handler for the given project which would handle publishing to
+ * the specified [destinations].
+ */
+ fun serving(project: Project, destinations: Set, vararg params: Any): H {
+ synchronized(handlers) {
+ val key = createKey(project)
+ var handler = handlers[key]
+ if (handler == null) {
+ handler = create(project, destinations, *params)
+ handlers[key] = handler
+ } else {
+ handler.publishTo(destinations)
+ }
+ return handler
+ }
+ }
+
+ /**
+ * Creates a new publication handler for the given project.
+ *
+ * @param project The project to which the handler applies.
+ * @param destinations The repositories for publishing artifacts of this project.
+ * @param params Optional parameters to be passed as constructor parameters for
+ * classes of the type [H].
+ */
+ protected abstract fun create(
+ project: Project,
+ destinations: Set,
+ vararg params: Any
+ ): H
+ }
+}
+
+/**
+ * Adds a Maven repository to the project specifying credentials, if they are
+ * [available][Repository.credentials] from the root project.
+ */
+private fun RepositoryHandler.register(project: Project, repository: Repository) {
+ val isSnapshot = project.version.toString().isSnapshot()
+ val credentials = repository.credentials(project.rootProject)
+ maven {
+ name = repository.name(isSnapshot)
+ url = project.uri(repository.target(isSnapshot))
+ credentials {
+ username = credentials?.username
+ password = credentials?.password
+ }
+ }
+}
diff --git a/buildSrc/src/main/kotlin/io/spine/gradle/publish/Publications.kt b/buildSrc/src/main/kotlin/io/spine/gradle/publish/Publications.kt
deleted file mode 100644
index c9acef8..0000000
--- a/buildSrc/src/main/kotlin/io/spine/gradle/publish/Publications.kt
+++ /dev/null
@@ -1,234 +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.gradle.publish
-
-import io.spine.gradle.Repository
-import io.spine.gradle.isSnapshot
-import org.gradle.api.Project
-import org.gradle.api.artifacts.dsl.RepositoryHandler
-import org.gradle.api.publish.maven.MavenPublication
-import org.gradle.api.tasks.TaskProvider
-import org.gradle.api.tasks.bundling.Jar
-import org.gradle.kotlin.dsl.apply
-import org.gradle.kotlin.dsl.create
-
-/**
- * The name of the Maven Publishing Gradle plugin.
- */
-private const val MAVEN_PUBLISH = "maven-publish"
-
-/**
- * Abstract base for handlers of publications in a project
- * with [spinePublishing] settings declared.
- */
-internal sealed class PublicationHandler(
- protected val project: Project,
- private val destinations: Set
-) {
-
- fun apply() = with(project) {
- if (!hasCustomPublishing) {
- apply(plugin = MAVEN_PUBLISH)
- }
-
- pluginManager.withPlugin(MAVEN_PUBLISH) {
- handlePublications()
- registerDestinations()
- configurePublishTask(destinations)
- }
- }
-
- /**
- * Either handles publications already declared in the given project,
- * or creates new ones.
- */
- abstract fun handlePublications()
-
- /**
- * Goes through the [destinations] and registers each as a repository for publishing
- * in the given Gradle project.
- */
- private fun registerDestinations() {
- val repositories = project.publishingExtension.repositories
- destinations.forEach { destination ->
- repositories.register(project, destination)
- }
- }
-
- /**
- * Copies the attributes of Gradle [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.
- *
- * Finally, the Apache Software License 2.0 is set as the only license
- * under which the published artifact is distributed.
- */
- protected fun MavenPublication.copyProjectAttributes() {
- groupId = project.group.toString()
- val prefix = project.spinePublishing.artifactPrefix
- if (!artifactId.startsWith(prefix)) {
- artifactId = prefix + artifactId
- }
- version = project.version.toString()
- pom.description.set(project.description)
-
- pom.licenses {
- license {
- name.set("The Apache Software License, Version 2.0")
- url.set("https://www.apache.org/licenses/LICENSE-2.0.txt")
- }
- }
- }
-}
-
-/**
- * Adds a Maven repository to the project specifying credentials, if they are
- * [available][Repository.credentials] from the root project.
- */
-private fun RepositoryHandler.register(project: Project, repository: Repository) {
- val isSnapshot = project.version.toString().isSnapshot()
- val target = if (isSnapshot) repository.snapshots else repository.releases
- val credentials = repository.credentials(project.rootProject)
- maven {
- url = project.uri(target)
- credentials {
- username = credentials?.username
- password = credentials?.password
- }
- }
-}
-
-/**
- * A publication for a typical Java project.
- *
- * In Gradle, to publish something, one should create a publication.
- * A publication has a name and consists of one or more artifacts plus information about
- * those artifacts – the metadata.
- *
- * An instance of this class represents [MavenPublication] named "mavenJava". It is generally
- * accepted that a publication with this name contains a Java project published to one or
- * more Maven repositories.
- *
- * By default, only a jar with the compilation output of `main` source set and its
- * metadata files are published. Other artifacts are specified through the
- * [constructor parameter][jarFlags]. Please, take a look on [specifyArtifacts] for additional info.
- *
- * @param jarFlags
- * flags for additional JARs published along with the compilation output.
- * @param destinations
- * Maven repositories to which the produced artifacts will be sent.
- * @see
- * Maven Publish Plugin | Publications
- */
-internal class StandardJavaPublicationHandler(
- project: Project,
- private val jarFlags: JarFlags,
- destinations: Set,
-) : PublicationHandler(project, destinations) {
-
- /**
- * Creates a new "mavenJava" [MavenPublication] in the given project.
- */
- override fun handlePublications() {
- val jars = project.artifacts(jarFlags)
- val publications = project.publications
- publications.create("mavenJava") {
- copyProjectAttributes()
- specifyArtifacts(jars)
- }
- }
-
- /**
- * Specifies which artifacts this [MavenPublication] will contain.
- *
- * A typical Maven publication contains:
- *
- * 1. Jar archives. For example, compilation output, sources, javadoc, etc.
- * 2. Maven metadata file that has the ".pom" extension.
- * 3. Gradle's metadata file that has the ".module" extension.
- *
- * Metadata files contain information about a publication itself, its artifacts, and their
- * dependencies. Presence of ".pom" file is mandatory for publication to be consumed by
- * `mvn` build tool itself or other build tools that understand Maven notation (Gradle, Ivy).
- * The presence of ".module" is optional, but useful when a publication is consumed by Gradle.
- *
- * @see Maven – POM Reference
- * @see
- * Understanding Gradle Module Metadata
- */
- private fun MavenPublication.specifyArtifacts(jars: Set>) {
-
- /* "java" component provides a jar with compilation output of "main" source set.
- It is NOT defined as another `Jar` task intentionally. Doing that will leave the
- publication without correct ".pom" and ".module" metadata files generated.
- */
- val javaComponent = project.components.findByName("java")
- javaComponent?.let {
- from(it)
- }
-
- /* Other artifacts are represented by `Jar` tasks. Those artifacts don't bring any other
- metadata in comparison with `Component` (such as dependencies notation).
- */
- jars.forEach {
- artifact(it)
- }
- }
-}
-
-/**
- * A handler for custom publications, which are declared under the [publications]
- * section of a module.
- *
- * Such publications should be treated differently than [StandardJavaPublicationHandler],
- * which is created for a module. Instead, since the publications are already declared,
- * this class only [assigns maven coordinates][copyProjectAttributes].
- *
- * A module which declares custom publications must be specified in
- * the [SpinePublishing.modulesWithCustomPublishing] property.
- *
- * If a module with [publications] declared locally is not specified as one with custom publishing,
- * it may cause a name clash between an artifact produced by the [standard][MavenPublication]
- * publication, and custom ones. To have both standard and custom publications,
- * please specify custom artifact IDs or classifiers for each custom publication.
- */
-internal class CustomPublicationHandler(project: Project, destinations: Set) :
- PublicationHandler(project, destinations) {
-
- override fun handlePublications() {
- project.publications.forEach {
- (it as MavenPublication).copyProjectAttributes()
- }
- }
-}
diff --git a/buildSrc/src/main/kotlin/io/spine/gradle/publish/PublishingExts.kt b/buildSrc/src/main/kotlin/io/spine/gradle/publish/PublishingExts.kt
index 62c639b..0a24b56 100644
--- a/buildSrc/src/main/kotlin/io/spine/gradle/publish/PublishingExts.kt
+++ b/buildSrc/src/main/kotlin/io/spine/gradle/publish/PublishingExts.kt
@@ -27,7 +27,8 @@
package io.spine.gradle.publish
import dokkaKotlinJar
-import io.spine.gradle.Repository
+import io.spine.gradle.isSnapshot
+import io.spine.gradle.repo.Repository
import io.spine.gradle.sourceSets
import java.util.*
import org.gradle.api.InvalidUserDataException
@@ -57,6 +58,13 @@ internal val Project.publishingExtension: PublishingExtension
internal val Project.publications: PublicationContainer
get() = publishingExtension.publications
+/**
+ * Obtains an instance, if available, of [SpinePublishing] extension
+ * applied to this project.
+ */
+internal val Project.localSpinePublishing: SpinePublishing?
+ get() = extensions.findByType()
+
/**
* Obtains [SpinePublishing] extension from this [Project].
*
@@ -65,7 +73,7 @@ internal val Project.publications: PublicationContainer
*/
internal val Project.spinePublishing: SpinePublishing
get() {
- val local = this.extensions.findByType()
+ val local = localSpinePublishing
if (local != null) {
return local
}
@@ -78,9 +86,16 @@ internal val Project.spinePublishing: SpinePublishing
/**
* Tells if this project has custom publishing.
+ *
+ * For a multi-module project this is checked by presence of this project
+ * in the list of [SpinePublishing.modulesWithCustomPublishing] of the root project.
+ *
+ * In a single-module project, the value of the [SpinePublishing.customPublishing]
+ * property is returned.
*/
internal val Project.hasCustomPublishing: Boolean
- get() = spinePublishing.modulesWithCustomPublishing.contains(name)
+ get() = rootProject.spinePublishing.modulesWithCustomPublishing.contains(name)
+ || spinePublishing.customPublishing
private const val PUBLISH_TASK = "publish"
@@ -93,7 +108,7 @@ private const val PUBLISH_TASK = "publish"
* Please note, task execution would not copy publications to the local Maven cache.
*
* @see
- * Tasks | Maven Publish Plugin
+ * Tasks | The Maven Publish Plugin
*/
internal val TaskContainer.publish: TaskProvider
get() = named(PUBLISH_TASK)
@@ -140,14 +155,45 @@ private fun TaskContainer.getOrCreatePublishTask(): TaskProvider =
register(PUBLISH_TASK)
}
+@Suppress(
+ /* Several types of exceptions may be thrown,
+ and Kotlin does not have a multi-catch support yet. */
+ "TooGenericExceptionCaught"
+)
private fun TaskContainer.registerCheckCredentialsTask(
- destinations: Set
-): TaskProvider =
- register("checkCredentials") {
- doLast {
- destinations.forEach { it.ensureCredentials(project) }
+ destinations: Set,
+): TaskProvider {
+ val checkCredentials = "checkCredentials"
+ try {
+ // The result of this call is ignored intentionally.
+ //
+ // We expect this line to fail with the exception
+ // in case the task with this name is NOT registered.
+ //
+ // Otherwise, we need to replace the existing task
+ // to avoid checking the credentials
+ // for some previously asked `destinations`.
+ named(checkCredentials)
+ val toConfigure = replace(checkCredentials)
+ toConfigure.doLastCredentialsCheck(destinations)
+ return named(checkCredentials)
+ } catch (_: Exception) {
+ return register(checkCredentials) { doLastCredentialsCheck(destinations) }
+ }
+}
+
+private fun Task.doLastCredentialsCheck(destinations: Set) {
+ doLast {
+ if (logger.isDebugEnabled) {
+ val isSnapshot = project.version.toString().isSnapshot()
+ val destinationsStr = destinations.joinToString(", ") { it.target(isSnapshot) }
+ logger.debug(
+ "Project '${project.name}': checking the credentials for repos: $destinationsStr."
+ )
}
+ destinations.forEach { it.ensureCredentials(project) }
}
+}
private fun Repository.ensureCredentials(project: Project) {
val credentials = credentials(project)
@@ -175,8 +221,8 @@ fun TaskContainer.excludeGoogleProtoFromArtifacts() {
* Locates or creates `sourcesJar` task in this [Project].
*
* The output of this task is a `jar` archive. The archive contains sources from `main` source set.
- * The task makes sure that sources from the directories below will be included into
- * a resulted archive:
+ * The task makes sure that sources from the directories below will be included
+ * in the resulting archive:
*
* - Kotlin
* - Java
@@ -220,8 +266,8 @@ internal fun Project.testJar(): TaskProvider = tasks.getOrCreate("testJar")
* Locates or creates `javadocJar` task in this [Project].
*
* The output of this task is a `jar` archive. The archive contains Javadoc,
- * generated upon Java sources from `main` source set. If javadoc for Kotlin is also needed,
- * apply Dokka plugin. It tunes `javadoc` task to generate docs upon Kotlin sources as well.
+ * generated upon Java sources from `main` source set. If Javadoc for Kotlin is also needed,
+ * apply the Dokka plugin. It tunes `javadoc` task to generate docs upon Kotlin sources as well.
*/
fun Project.javadocJar(): TaskProvider = tasks.getOrCreate("javadocJar") {
archiveClassifier.set("javadoc")
@@ -275,4 +321,3 @@ internal fun Project.artifacts(jarFlags: JarFlags): Set> {
return tasks
}
-
diff --git a/buildSrc/src/main/kotlin/io/spine/gradle/publish/PublishingRepos.kt b/buildSrc/src/main/kotlin/io/spine/gradle/publish/PublishingRepos.kt
index f383e68..eea6dc1 100644
--- a/buildSrc/src/main/kotlin/io/spine/gradle/publish/PublishingRepos.kt
+++ b/buildSrc/src/main/kotlin/io/spine/gradle/publish/PublishingRepos.kt
@@ -26,7 +26,7 @@
package io.spine.gradle.publish
-import io.spine.gradle.Repository
+import io.spine.gradle.repo.Repository
/**
* Repositories to which we may publish.
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 2f74536..9dc7d7c 100644
--- a/buildSrc/src/main/kotlin/io/spine/gradle/publish/SpinePublishing.kt
+++ b/buildSrc/src/main/kotlin/io/spine/gradle/publish/SpinePublishing.kt
@@ -28,9 +28,7 @@
package io.spine.gradle.publish
-import dokkaJavaJar
-import dokkaKotlinJar
-import io.spine.gradle.Repository
+import io.spine.gradle.repo.Repository
import org.gradle.api.Project
import org.gradle.api.publish.maven.plugins.MavenPublishPlugin
import org.gradle.kotlin.dsl.apply
@@ -44,75 +42,112 @@ import org.gradle.kotlin.dsl.findByType
*
* The extension can be configured for single- and multi-module projects.
*
+ * ## Using in a multi-module project
+ *
* When used with a multi-module project, the extension should be opened in a root project's
* build file. The published modules are specified explicitly by their names:
*
- * ```
+ * ```kotlin
* spinePublishing {
* modules = setOf(
* "subprojectA",
* "subprojectB",
* )
- * destinations = setOf(
- * PublishingRepos.cloudRepo,
- * PublishingRepos.cloudArtifactRegistry,
+ * destinations = PublishingRepos.run { setOf(
+ * cloudArtifactRegistry,
+ * gitHub("") // The name of the GitHub repository of the project.
+ * )}
+ * }
+ * ```
+ *
+ * ### Filtering out test-only modules
+ *
+ * Sometimes a functional or an integration test requires a significant amount of
+ * configuration code which is better understood when isolated into a separate module.
+ * Conventionally, we use the `-tests` suffix for naming such modules.
+ *
+ * In order to avoid publishing of such a test-only module, we use the following extensions
+ * for the Gradle [Project] class: [productionModules], [productionModuleNames].
+ * So the above code for specifying the modules to publish could be rewritten as follows:
+ *
+ * ```kotlin
+ * spinePublishing {
+ * modules = productionModuleNames.toSet()
+ * }
+ * ```
+ * This code works for most of the projects.
+ *
+ * ### Arranging custom publishing for a module
+ * ```kotlin
+ *
+ * 1. Modify the list of standardly published modules in the root project like this:
+ *
+ * ```kotlin
+ * spinePublishing {
+ * modules = productionModuleNames
+ * .minus("my-custom-module")
+ * .toSet()
+ *
+ * modulesWithCustomPublishing = setOf(
+ * "my-custom-module"
* )
+ *
+ * // ...
* }
* ```
+ * 2. Arrange the custom publishing in the `my-custom-module` project.
+ *
+ * ## Using in a single-module project
*
* When used with a single-module project, the extension should be opened in a project's build file.
* Only destinations should be specified:
*
- * ```
+ * ```kotlin
* spinePublishing {
- * destinations = setOf(
- * PublishingRepos.cloudRepo,
- * PublishingRepos.cloudArtifactRegistry,
- * )
+ * destinations = PublishingRepos.run { setOf(
+ * cloudArtifactRegistry,
+ * gitHub("")
+ * )}
* }
* ```
*
- * It is worth to mention, that publishing of a module can be configured only from a single place.
+ * ## Publishing modules
+ *
+ * It is worth mentioning that publishing of a module can be configured only from a single place.
* For example, declaring `subprojectA` as published in a root project and opening
* `spinePublishing` extension within `subprojectA` itself would lead to an exception.
*
- * In Gradle, in order to publish something somewhere one should create a publication. In each
+ * In Gradle, in order to publish something somewhere, one should create a publication. In each
* of published modules, the extension will create a [publication][StandardJavaPublicationHandler]
- * named "mavenJava". All artifacts, published by this extension belong to this publication.
+ * named "mavenJava". All artifacts published by this extension belong to this publication.
*
- * By default, along with the compilation output of "main" source set, the extension publishes
+ * ## Published artifacts
+ *
+ * By default, along with the compilation output of the `main` source set, the extension publishes
* the following artifacts:
*
- * 1. [sourcesJar] – sources from "main" source set. Includes "hand-made" Java,
- * Kotlin and Proto files. In order to include the generated code into this artifact, a module
- * should specify those files as a part of "main" source set.
- *
- * Here's an example of how to do that:
- *
- * ```
- * sourceSets {
- * val generatedDir by extra("$projectDir/generated")
- * val generatedSpineDir by extra("$generatedDir/main/java")
- * main {
- * java.srcDir(generatedSpineDir)
- * }
- * }
- * ```
- * 2. [protoJar] – only Proto sources from "main" source set. It's published only if
+ * 1. [sourcesJar] — sources from the `main` source set. Includes handcrafted and generated
+ * code in Java, Kotlin, and `.proto` files.
+ *
+ * 2. [protoJar] – only `.proto` sources from the `main` source set. It's published only if
* Proto files are actually present in the source set. Publication of this artifact is optional
* and can be disabled via [SpinePublishing.protoJar].
- * 3. [javadocJar] - javadoc, generated upon Java sources from "main" source set.
- * If javadoc for Kotlin is also needed, apply Dokka plugin. It tunes `javadoc` task to generate
- * docs upon Kotlin sources as well.
- * 4. [dokkaKotlinJar] - documentation generated by Dokka for Kotlin and Java sources
+ *
+ * 3. [javadocJar] — Javadoc, generated upon Java sources from the `main` source set.
+ * If Javadoc for Kotlin is also needed, apply the Dokka plugin.
+ * It tunes the `javadoc` task to generate docs upon Kotlin sources as well.
+ *
+ * 4. [dokkaKotlinJar] — documentation generated by Dokka for Kotlin and Java sources
* using the Kotlin API mode.
- * 5. [dokkaJavaJar] - documentation generated by Dokka for Kotlin and Java sources
- * * using the Java API mode.
+ *
+ * 5. [dokkaJavaJar] — documentation generated by Dokka for Kotlin and Java sources
+ * using the Java API mode.
*
* Additionally, [testJar] artifact can be published. This artifact contains compilation output
- * of "test" source set. Use [SpinePublishing.testJar] to enable its publishing.
+ * of the `test` source set. Use [SpinePublishing.testJar] to enable its publishing.
*
* @see [artifacts]
+ * @see SpinePublishing
*/
fun Project.spinePublishing(block: SpinePublishing.() -> Unit) {
apply()
@@ -127,11 +162,19 @@ fun Project.spinePublishing(block: SpinePublishing.() -> Unit) {
}
/**
- * A Gradle extension for setting up publishing of spine modules using `maven-publish` plugin.
+ * A Gradle extension for setting up publishing of modules of Spine SDK modules
+ * using `maven-publish` plugin.
+ *
+ * ### Implementation Note
+ *
+ * This extension is overloaded with responsibilities.
+ * It basically does what an extension AND a Gradle plugin would normally do.
+ *
+ * We [should introduce a plugin class](https://github.com/SpineEventEngine/config/issues/562)
+ * and move the code related to creating tasks or setting dependencies between them into the plugin.
*
- * @param project
- * a project in which the extension is opened. By default, this project will be
- * published as long as a [set][modules] of modules to publish is not specified explicitly.
+ * @param project The project in which the extension is opened. By default, this project will be
+ * published as long as a [set][modules] of modules to publish is not specified explicitly.
*
* @see spinePublishing
*/
@@ -163,18 +206,27 @@ open class SpinePublishing(private val project: Project) {
var modules: Set = emptySet()
/**
- * Controls whether the published module needs standard publications.
+ * Controls whether the [module][project] needs standard publications.
*
- * If `true`, the module should configure publications on its own.
- * Otherwise, the extension will configure standard [ones][StandardJavaPublicationHandler].
+ * Default value is `false`.
+ *
+ * In a single module [project], settings this property to `true` it tells
+ * that the project configures the publication in a specific way and
+ * [CustomPublicationHandler] should be used.
+ * Otherwise, the extension will configure the
+ * [standard publication][StandardJavaPublicationHandler].
*
- * This property is analogue of [modulesWithCustomPublishing] for projects,
+ * This property is an analogue of [modulesWithCustomPublishing] in
+ * [multi-module][Project.getSubprojects] projects,
* for which [spinePublishing] is configured individually.
*
- * Setting of this property and having a non-empty [modules] will lead
- * to an exception.
+ * Setting of this property to `true` and having a non-empty [modules] property
+ * in the project to which the extension is applied will lead to [IllegalStateException].
*
- * Default value is `false`.
+ * Settings this property to `true` in a subproject serves only the documentation purposes.
+ * This subproject still must be listed in the [modulesWithCustomPublishing] property in
+ * the extension of the [rootProject][Project.getRootProject], so that its publication
+ * can be configured in a specific way.
*/
var customPublishing = false
@@ -191,17 +243,17 @@ open class SpinePublishing(private val project: Project) {
* Usually, Spine-related projects are published to one or more repositories,
* declared in [PublishingRepos]:
*
- * ```
- * destinations = setOf(
- * PublishingRepos.cloudRepo,
- * PublishingRepos.cloudArtifactRegistry,
- * PublishingRepos.gitHub("base"),
- * )
+ * ```kotlin
+ * destinations = PublishingRepos.run { setOf(
+ * cloudArtifactRegistry,
+ * gitHub("") // The name of the GitHub repository of the project.
+ * )}
* ```
*
- * Empty by default.
+ * If the property is not initialized, the destinations will be taken from
+ * the parent project.
*/
- var destinations: Set = emptySet()
+ lateinit var destinations: Set
/**
* A prefix to be added before the name of each artifact.
@@ -214,7 +266,7 @@ open class SpinePublishing(private val project: Project) {
*
* Here's an example of how to disable it for some of the published modules:
*
- * ```
+ * ```kotlin
* spinePublishing {
* modules = setOf(
* "subprojectA",
@@ -238,7 +290,7 @@ open class SpinePublishing(private val project: Project) {
* }
* ```
*
- * The resulting artifact is available under "proto" classifier.
+ * The resulting artifact is available under the "proto" classifier.
* For example, in Gradle 7+, one could depend on it like this:
*
* ```
@@ -277,8 +329,8 @@ open class SpinePublishing(private val project: Project) {
* }
* ```
*
- * The resulting artifact is available under "test" classifier. For example,
- * in Gradle 7+, one could depend on it like this:
+ * The resulting artifact is available under the "test" classifier.
+ * For example, in Gradle 7+, one could depend on it like this:
*
* ```
* implementation("io.spine:spine-client:$version@test")
@@ -310,7 +362,7 @@ open class SpinePublishing(private val project: Project) {
* }
* ```
*
- * The resulting artifact is available under "dokka" classifier.
+ * The resulting artifact is available under the "dokka" classifier.
*/
fun dokkaJar(block: DokkaJar.() -> Unit) = dokkaJar.run(block)
@@ -367,27 +419,47 @@ open class SpinePublishing(private val project: Project) {
*
* We selected to use [Project.afterEvaluate] so that we can configure publishing of multiple
* modules from a root project. When we do this, we configure publishing for a module,
- * build file of which has not been even evaluated yet.
+ * a build file of which has not been even evaluated yet.
*
* The simplest example here is specifying of `version` and `group` for Maven coordinates.
- * Let's suppose, they are declared in a module's build file. It is a common practice.
- * But publishing of the module is configured from a root project's build file. By the time,
- * when we need to specify them, we just don't know them. As a result, we have to use
- * [Project.afterEvaluate] in order to guarantee that a module will be configured by the time
- * we configure publishing for it.
+ * Let's suppose they are declared in a module's build file. It is a common practice.
+ * But publishing of the module is configured from a root project's build file.
+ * By the time when we need to specify them, we just don't know them.
+ * As the result, we have to use [Project.afterEvaluate] in order to guarantee that
+ * the module will be configured by the time we configure publishing for it.
*/
private fun Project.setUpPublishing(jarFlags: JarFlags) {
val customPublishing = modulesWithCustomPublishing.contains(name) || customPublishing
+ val destinations = project.publishTo()
val handler = if (customPublishing) {
- CustomPublicationHandler(project, destinations)
+ CustomPublicationHandler.serving(project, destinations)
} else {
- StandardJavaPublicationHandler(project, jarFlags, destinations)
+ StandardJavaPublicationHandler.serving(project, destinations, jarFlags)
}
afterEvaluate {
handler.apply()
}
}
+ /**
+ * Obtains the set of repositories for publishing.
+ *
+ * If there is a local instance of [io.spine.gradle.publish.SpinePublishing] extension,
+ * the [destinations] are obtained from this instance.
+ * Otherwise, the function attempts to obtain it from a [parent project][Project.getParent].
+ * If there is no a parent project, an empty set is returned.
+ *
+ * The normal execution should end up at the root project of a multi-module project
+ * if there are no custom destinations specified by the local extension.
+ */
+ private fun Project.publishTo(): Set {
+ val ext = localSpinePublishing
+ if (ext != null && ext::destinations.isInitialized) {
+ return destinations
+ }
+ return parent?.publishTo() ?: emptySet()
+ }
+
/**
* Obtains an artifact ID for the given project.
*
@@ -406,8 +478,11 @@ open class SpinePublishing(private val project: Project) {
private fun ensureProtoJarExclusionsArePublished() {
val nonPublishedExclusions = protoJar.exclusions.minus(modules)
if (nonPublishedExclusions.isNotEmpty()) {
- throw IllegalStateException("One or more modules are marked as `excluded from proto " +
- "JAR publication`, but they are not even published: $nonPublishedExclusions")
+ error(
+ "One or more modules are marked as" +
+ " `excluded from proto JAR publication`," +
+ " but they are not even published: $nonPublishedExclusions."
+ )
}
}
@@ -431,7 +506,7 @@ open class SpinePublishing(private val project: Project) {
/**
* Ensures that publishing of a module is configured only from a single place.
*
- * We allow configuration of publishing from two places - a root project and module itself.
+ * We allow configuration of publishing from two places - a root project and the module itself.
* Here we verify that publishing of a module is not configured in both places simultaneously.
*/
private fun ensureModulesNotDuplicated() {
diff --git a/buildSrc/src/main/kotlin/io/spine/gradle/publish/StandardJavaPublicationHandler.kt b/buildSrc/src/main/kotlin/io/spine/gradle/publish/StandardJavaPublicationHandler.kt
new file mode 100644
index 0000000..06d78c1
--- /dev/null
+++ b/buildSrc/src/main/kotlin/io/spine/gradle/publish/StandardJavaPublicationHandler.kt
@@ -0,0 +1,133 @@
+/*
+ * 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.gradle.publish
+
+import io.spine.gradle.repo.Repository
+import org.gradle.api.Project
+import org.gradle.api.publish.maven.MavenPublication
+import org.gradle.api.tasks.TaskProvider
+import org.gradle.api.tasks.bundling.Jar
+import org.gradle.kotlin.dsl.create
+
+/**
+ * A publication for a typical Java project.
+ *
+ * In Gradle, to publish something, one should create a publication.
+ * A publication has a name and consists of one or more artifacts plus information about
+ * those artifacts – the metadata.
+ *
+ * An instance of this class represents
+ * [MavenPublication][org.gradle.api.publish.maven.MavenPublication]
+ * named [`"mavenJava"`][PUBLICATION_NAME].
+ * It is generally accepted that a publication with this name contains a Java project
+ * published to one or more Maven repositories.
+ *
+ * By default, only a jar with the compilation output of `main` source set and its
+ * metadata files are published. Other artifacts are specified through the
+ * [constructor parameter][jarFlags].
+ * Please take a look on [specifyArtifacts] for additional info.
+ *
+ * @param jarFlags The flags for additional JARs published along with the compilation output.
+ * @param destinations Maven repositories to which the produced artifacts will be sent.
+ * @see
+ * The Maven Publish Plugin | Publications
+ * @see CustomPublicationHandler
+ */
+internal class StandardJavaPublicationHandler private constructor(
+ project: Project,
+ private val jarFlags: JarFlags,
+ destinations: Set,
+) : PublicationHandler(project, destinations) {
+
+ companion object : HandlerFactory() {
+
+ /**
+ * The name of the publication created by [StandardJavaPublicationHandler].
+ */
+ const val PUBLICATION_NAME = "mavenJava"
+
+ override fun create(
+ project: Project,
+ destinations: Set,
+ vararg params: Any
+ ): StandardJavaPublicationHandler {
+ return StandardJavaPublicationHandler(project, params[0] as JarFlags, destinations)
+ }
+ }
+
+ /**
+ * Creates a new `"mavenJava"` [MavenPublication][org.gradle.api.publish.maven.MavenPublication]
+ * in the [project] associated with this publication handler.
+ */
+ override fun handlePublications() {
+ val jars = project.artifacts(jarFlags)
+ val publications = project.publications
+ publications.create(PUBLICATION_NAME) {
+ copyProjectAttributes()
+ specifyArtifacts(jars)
+ }
+ }
+
+ /**
+ * Specifies which artifacts this [MavenPublication] will contain.
+ *
+ * A typical Maven publication contains:
+ *
+ * 1. Jar archives. For example, compilation output, sources, javadoc, etc.
+ * 2. Maven metadata file that has the ".pom" extension.
+ * 3. Gradle's metadata file that has the ".module" extension.
+ *
+ * Metadata files contain information about a publication itself, its artifacts, and their
+ * dependencies. Presence of ".pom" file is mandatory for publication to be consumed by
+ * `mvn` build tool itself or other build tools that understand Maven notation (Gradle, Ivy).
+ * The presence of ".module" is optional, but useful when a publication is consumed by Gradle.
+ *
+ * @see Maven – POM Reference
+ * @see
+ * Understanding Gradle Module Metadata
+ */
+ private fun MavenPublication.specifyArtifacts(jars: Set>) {
+
+ /*
+ "java" component provides a jar with compilation output of "main" source set.
+ It is NOT defined as another `Jar` task intentionally. Doing that will leave the
+ publication without correct ".pom" and ".module" metadata files generated.
+ */
+ val javaComponent = project.components.findByName("java")
+ javaComponent?.let {
+ from(it)
+ }
+
+ /*
+ Other artifacts are represented by `Jar` tasks. Those artifacts do not bring any other
+ metadata in comparison with `Component` (such as the `dependencies` notation).
+ */
+ jars.forEach {
+ artifact(it)
+ }
+ }
+}
diff --git a/buildSrc/src/main/kotlin/io/spine/gradle/javadoc/TaskContainerExtensions.kt b/buildSrc/src/main/kotlin/io/spine/gradle/repo/Credentials.kt
similarity index 77%
rename from buildSrc/src/main/kotlin/io/spine/gradle/javadoc/TaskContainerExtensions.kt
rename to buildSrc/src/main/kotlin/io/spine/gradle/repo/Credentials.kt
index 7e5b517..1624b38 100644
--- a/buildSrc/src/main/kotlin/io/spine/gradle/javadoc/TaskContainerExtensions.kt
+++ b/buildSrc/src/main/kotlin/io/spine/gradle/repo/Credentials.kt
@@ -24,17 +24,12 @@
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-package io.spine.gradle.javadoc
-
-import org.gradle.api.tasks.TaskContainer
-import org.gradle.api.tasks.javadoc.Javadoc
-
-/**
- * Finds a [Javadoc] Gradle task by the passed name.
- */
-fun TaskContainer.javadocTask(named: String) = this.getByName(named) as Javadoc
+package io.spine.gradle.repo
/**
- * Finds a default [Javadoc] Gradle task.
+ * Password credentials for a Maven repository.
*/
-fun TaskContainer.javadocTask() = this.getByName("javadoc") as Javadoc
+data class Credentials(
+ val username: String?,
+ val password: String?
+)
diff --git a/buildSrc/src/main/kotlin/io/spine/gradle/RepoSlug.kt b/buildSrc/src/main/kotlin/io/spine/gradle/repo/RepoSlug.kt
similarity index 94%
rename from buildSrc/src/main/kotlin/io/spine/gradle/RepoSlug.kt
rename to buildSrc/src/main/kotlin/io/spine/gradle/repo/RepoSlug.kt
index 71fbac3..461c690 100644
--- a/buildSrc/src/main/kotlin/io/spine/gradle/RepoSlug.kt
+++ b/buildSrc/src/main/kotlin/io/spine/gradle/repo/RepoSlug.kt
@@ -24,13 +24,14 @@
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-package io.spine.gradle
+package io.spine.gradle.repo
import org.gradle.api.GradleException
/**
* A name of a repository.
*/
+@Suppress("unused")
class RepoSlug(val value: String) {
companion object {
@@ -44,7 +45,7 @@ class RepoSlug(val value: String) {
/**
* Reads `REPO_SLUG` environment variable and returns its value.
*
- * In case it is not set, a [GradleException] is thrown.
+ * In case it is not set, a [org.gradle.api.GradleException] is thrown.
*/
fun fromVar(): RepoSlug {
val envValue = System.getenv(environmentVariable)
diff --git a/buildSrc/src/main/kotlin/io/spine/gradle/repo/Repositories.kt b/buildSrc/src/main/kotlin/io/spine/gradle/repo/Repositories.kt
new file mode 100644
index 0000000..43abe47
--- /dev/null
+++ b/buildSrc/src/main/kotlin/io/spine/gradle/repo/Repositories.kt
@@ -0,0 +1,172 @@
+/*
+ * 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.
+ */
+
+@file:Suppress("TooManyFunctions") // Deprecated functions will be kept for a while.
+
+package io.spine.gradle.repo
+
+import io.spine.gradle.publish.PublishingRepos
+import java.net.URI
+import org.gradle.api.artifacts.dsl.RepositoryHandler
+import org.gradle.api.artifacts.repositories.MavenArtifactRepository
+import org.gradle.kotlin.dsl.maven
+
+/**
+ * Registers the standard set of Maven repositories.
+ *
+ * To be used in `buildscript` clauses when a fully-qualified call must be made.
+ */
+@Suppress("unused")
+@Deprecated(
+ message = "Please use `standardSpineSdkRepositories()`.",
+ replaceWith = ReplaceWith("standardSpineSdkRepositories()")
+)
+fun doApplyStandard(repositories: RepositoryHandler) = repositories.standardToSpineSdk()
+
+/**
+ * A scrambled version of PAT generated with the only "read:packages" scope.
+ *
+ * The scrambling around PAT is necessary because GitHub analyzes commits for the presence
+ * of tokens and invalidates them.
+ *
+ * @see
+ * How to make GitHub packages to the public
+ */
+private object Pat {
+ private const val shade = "_phg->8YlN->MFRA->gxIk->HVkm->eO6g->FqHJ->z8MS->H4zC->ZEPq"
+ private const val separator = "->"
+ private val chunks: Int = shade.split(separator).size - 1
+
+ fun credentials(): Credentials {
+ val pass = shade.replace(separator, "").splitAndReverse(chunks, "")
+ return Credentials("public", pass)
+ }
+
+ /**
+ * Splits this string to the chunks, reverses each chunk, and joins them
+ * back to a string using the [separator].
+ */
+ private fun String.splitAndReverse(numChunks: Int, separator: String): String {
+ check(length / numChunks >= 2) {
+ "The number of chunks is too big. Must be <= ${length / 2}."
+ }
+ val chunks = chunked(length / numChunks)
+ val reversedChunks = chunks.map { chunk -> chunk.reversed() }
+ return reversedChunks.joinToString(separator)
+ }
+}
+
+/**
+ * Adds a read-only view to all artifacts of the SpineEventEngine
+ * GitHub organization.
+ */
+fun RepositoryHandler.spineArtifacts(): MavenArtifactRepository = maven {
+ url = URI("https://maven.pkg.github.com/SpineEventEngine/*")
+ includeSpineOnly()
+ val pat = Pat.credentials()
+ credentials {
+ username = pat.username
+ password = pat.password
+ }
+}
+
+val RepositoryHandler.intellijReleases: MavenArtifactRepository
+ get() = maven("https://www.jetbrains.com/intellij-repository/releases")
+
+val RepositoryHandler.jetBrainsCacheRedirector: MavenArtifactRepository
+ get() = maven("https://cache-redirector.jetbrains.com/intellij-dependencies")
+
+/**
+ * Applies repositories commonly used by Spine Event Engine projects.
+ */
+fun RepositoryHandler.standardToSpineSdk() {
+ spineArtifacts()
+
+ @Suppress("DEPRECATION") // Still use `CloudRepo` for earlier versions.
+ val spineRepos = listOf(
+ Repos.spine,
+ Repos.spineSnapshots,
+ Repos.artifactRegistry,
+ Repos.artifactRegistrySnapshots
+ )
+
+ spineRepos
+ .map { URI(it) }
+ .forEach {
+ maven {
+ url = it
+ includeSpineOnly()
+ }
+ }
+
+ intellijReleases
+ jetBrainsCacheRedirector
+
+ maven {
+ url = URI(Repos.sonatypeSnapshots)
+ }
+
+ mavenCentral()
+ gradlePluginPortal()
+ mavenLocal().includeSpineOnly()
+}
+
+@Deprecated(
+ message = "Please use `standardToSpineSdk() instead.",
+ replaceWith = ReplaceWith("standardToSpineSdk()")
+)
+fun RepositoryHandler.applyStandard() = this.standardToSpineSdk()
+
+/**
+ * Defines names of additional repositories commonly used in the Spine SDK projects.
+ *
+ * @see [applyStandard]
+ */
+@Suppress(
+ "DEPRECATION" /* Still need to use `CloudRepo` for older versions. */,
+ "ConstPropertyName" // https://bit.ly/kotlin-prop-names
+)
+private object Repos {
+ @Deprecated(message = "Please use `cloudArtifactRegistry.releases` instead.")
+ val spine = io.spine.gradle.publish.CloudRepo.published.target(snapshots = false)
+
+ @Deprecated(message = "Please use `artifactRegistry.snapshots` instead.")
+ val spineSnapshots = io.spine.gradle.publish.CloudRepo.published.target(snapshots = true)
+
+ val artifactRegistry = PublishingRepos.cloudArtifactRegistry.target(snapshots = false)
+ val artifactRegistrySnapshots = PublishingRepos.cloudArtifactRegistry.target(snapshots = true)
+
+ const val sonatypeSnapshots = "https://oss.sonatype.org/content/repositories/snapshots"
+}
+
+/**
+ * Narrows down the search for this repository to Spine-related artifact groups.
+ */
+private fun MavenArtifactRepository.includeSpineOnly() {
+ content {
+ includeGroupByRegex("io\\.spine.*")
+ }
+}
diff --git a/buildSrc/src/main/kotlin/io/spine/gradle/repo/Repository.kt b/buildSrc/src/main/kotlin/io/spine/gradle/repo/Repository.kt
new file mode 100644
index 0000000..a586ffd
--- /dev/null
+++ b/buildSrc/src/main/kotlin/io/spine/gradle/repo/Repository.kt
@@ -0,0 +1,138 @@
+/*
+ * 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.gradle.repo
+
+import java.io.File
+import java.util.Properties
+import org.gradle.api.Project
+
+/**
+ * A Maven repository.
+ *
+ * @param name The human-readable name which is also used in the publishing task names
+ * for identifying the target repository.
+ * The name must match the [regex].
+ * @param releases The URL for publishing release versions of artifacts.
+ * @param snapshots The URL for publishing [snapshot][io.spine.gradle.isSnapshot] versions.
+ * @param credentialsFile The path to the file which contains the credentials for the registry.
+ * @param credentialValues The function to obtain an instance of [Credentials] from
+ * a Gradle [Project], if [credentialsFile] is not specified.
+ */
+data class Repository(
+ private val name: String,
+ private val releases: String,
+ private val snapshots: String,
+ private val credentialsFile: String? = null,
+ private val credentialValues: ((Project) -> Credentials?)? = null
+) {
+
+ companion object {
+ val regex = Regex("[A-Za-z0-9_\\-.]+")
+ }
+
+ init {
+ require(regex.matches(name)) {
+ "The repository name `$name` does not match the regex `$regex`."
+ }
+ }
+
+ /**
+ * Obtains the name of the repository.
+ *
+ * The name will be primarily used in the publishing tasks.
+ *
+ * @param snapshots If `true` this repository is used for publishing snapshots,
+ * and the suffix `-snapshots` will be added to the value of the [name] property.
+ * Otherwise, the function returns just [name].
+ */
+ fun name(snapshots: Boolean): String = name + if (snapshots) "-snapshots" else ""
+
+ /**
+ * Obtains the target URL of the repository for publishing.
+ */
+ fun target(snapshots: Boolean): String = if (snapshots) this.snapshots else releases
+
+ /**
+ * Tells if release and snapshot versions are published to the same destination
+ * of this repository.
+ */
+ fun hasOneTarget() = snapshots == releases
+
+ /**
+ * Obtains the publishing password credentials to this repository.
+ *
+ * If the credentials are represented by a `.properties` file, reads the file and parses
+ * the credentials. The file must have properties `user.name` and `user.password`, which store
+ * the username and the password for the Maven repository auth.
+ */
+ fun credentials(project: Project): Credentials? = when {
+ credentialValues != null -> credentialValues.invoke(project)
+ credentialsFile != null -> credsFromFile(credentialsFile, project)
+ else -> throw IllegalArgumentException(
+ "Credentials file or a supplier function should be passed."
+ )
+ }
+
+ private fun credsFromFile(fileName: String, project: Project): Credentials? {
+ val file = project.rootProject.file(fileName)
+ if (file.exists().not()) {
+ return null
+ }
+
+ val log = project.logger
+ log.info("Using credentials from `$fileName`.")
+ val creds = file.parseCredentials()
+ log.info("Publishing build as `${creds.username}`.")
+ return creds
+ }
+
+ private fun File.parseCredentials(): Credentials {
+ val properties = Properties().apply { load(inputStream()) }
+ val username = properties.getProperty("user.name")
+ val password = properties.getProperty("user.password")
+ return Credentials(username, password)
+ }
+
+ override fun equals(other: Any?): Boolean = when {
+ this === other -> true
+ other !is Repository -> false
+ else -> name == other.name &&
+ releases == other.releases &&
+ snapshots == other.snapshots
+}
+
+ override fun hashCode(): Int {
+ var result = name.hashCode()
+ result = 31 * result + releases.hashCode()
+ result = 31 * result + snapshots.hashCode()
+ return result
+ }
+
+ override fun toString(): String {
+ return name
+ }
+}
diff --git a/buildSrc/src/main/kotlin/io/spine/gradle/report/coverage/CodebaseFilter.kt b/buildSrc/src/main/kotlin/io/spine/gradle/report/coverage/CodebaseFilter.kt
index a5b9e72..efdf605 100644
--- a/buildSrc/src/main/kotlin/io/spine/gradle/report/coverage/CodebaseFilter.kt
+++ b/buildSrc/src/main/kotlin/io/spine/gradle/report/coverage/CodebaseFilter.kt
@@ -29,7 +29,6 @@ package io.spine.gradle.report.coverage
import com.google.errorprone.annotations.CanIgnoreReturnValue
import io.spine.gradle.report.coverage.FileFilter.generatedOnly
import java.io.File
-import kotlin.streams.toList
import org.gradle.api.Project
import org.gradle.api.file.ConfigurableFileTree
import org.gradle.api.file.FileTree
diff --git a/buildSrc/src/main/kotlin/io/spine/gradle/report/coverage/JacocoConfig.kt b/buildSrc/src/main/kotlin/io/spine/gradle/report/coverage/JacocoConfig.kt
index de5d00b..5114add 100644
--- a/buildSrc/src/main/kotlin/io/spine/gradle/report/coverage/JacocoConfig.kt
+++ b/buildSrc/src/main/kotlin/io/spine/gradle/report/coverage/JacocoConfig.kt
@@ -28,7 +28,7 @@ package io.spine.gradle.report.coverage
import io.spine.dependency.test.Jacoco
import io.spine.gradle.applyPlugin
-import io.spine.gradle.findTask
+import io.spine.gradle.getTask
import io.spine.gradle.report.coverage.TaskName.check
import io.spine.gradle.report.coverage.TaskName.copyReports
import io.spine.gradle.report.coverage.TaskName.jacocoRootReport
@@ -181,7 +181,7 @@ class JacocoConfig(
private fun registerCopy(tasks: TaskContainer): TaskProvider {
val everyExecData = mutableListOf()
projects.forEach { project ->
- val jacocoTestReport = project.findTask(jacocoTestReport.name)
+ val jacocoTestReport = project.getTask(jacocoTestReport.name)
val executionData = jacocoTestReport.executionData
everyExecData.add(executionData)
}
@@ -194,7 +194,7 @@ class JacocoConfig(
rename {
"${UUID.randomUUID()}.exec"
}
- dependsOn(projects.map { it.findTask(jacocoTestReport.name) })
+ dependsOn(projects.map { it.getTask(jacocoTestReport.name) })
}
return copyReports
}
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 9b7a57f..ec86eb5 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
@@ -30,7 +30,7 @@ import com.github.jk1.license.LicenseReportExtension
import com.github.jk1.license.LicenseReportExtension.ALL
import com.github.jk1.license.LicenseReportPlugin
import io.spine.gradle.applyPlugin
-import io.spine.gradle.findTask
+import io.spine.gradle.getTask
import java.io.File
import org.gradle.api.Project
import org.gradle.api.Task
@@ -98,7 +98,7 @@ object LicenseReporter {
}
/**
- * Tells to merge all per-project reports which were previously [generated][generateReportIn]
+ * Tells to merge all per-project reports that were previously [generated][generateReportIn]
* for each of the subprojects of the root Gradle project.
*
* The merge result is placed according to [Paths].
@@ -109,10 +109,10 @@ object LicenseReporter {
val rootProject = project.rootProject
val mergeTask = rootProject.tasks.register(mergeTaskName) {
val consolidationTask = this
- val assembleTask = project.findTask("assemble")
+ val assembleTask = project.getTask("assemble")
val sourceProjects: Iterable = sourceProjects(rootProject)
sourceProjects.forEach {
- val perProjectTask = it.findTask(projectTaskName)
+ val perProjectTask = it.getTask(projectTaskName)
consolidationTask.dependsOn(perProjectTask)
perProjectTask.dependsOn(assembleTask)
}
@@ -121,7 +121,7 @@ object LicenseReporter {
}
dependsOn(assembleTask)
}
- project.findTask("build")
+ project.getTask("build")
.finalizedBy(mergeTask)
}
diff --git a/buildSrc/src/main/kotlin/io/spine/gradle/report/pom/DependencyWriter.kt b/buildSrc/src/main/kotlin/io/spine/gradle/report/pom/DependencyWriter.kt
index af3873c..eda2493 100644
--- a/buildSrc/src/main/kotlin/io/spine/gradle/report/pom/DependencyWriter.kt
+++ b/buildSrc/src/main/kotlin/io/spine/gradle/report/pom/DependencyWriter.kt
@@ -182,8 +182,8 @@ private fun Project.deduplicate(dependencies: Set): List
- group.value.maxByOrNull { dep -> dep.version }!!
- }
+ group.value.maxByOrNull { dep -> dep.version ?: "" }
+ }.filterNotNull()
return filtered
}
diff --git a/buildSrc/src/main/kotlin/io/spine/gradle/report/pom/ModuleDependency.kt b/buildSrc/src/main/kotlin/io/spine/gradle/report/pom/ModuleDependency.kt
index 13d4177..3d72de1 100644
--- a/buildSrc/src/main/kotlin/io/spine/gradle/report/pom/ModuleDependency.kt
+++ b/buildSrc/src/main/kotlin/io/spine/gradle/report/pom/ModuleDependency.kt
@@ -40,7 +40,7 @@ internal class ModuleDependency(
val project: Project,
val configuration: Configuration,
private val dependency: Dependency,
- private val factualVersion: String = dependency.version!!
+ private val factualVersion: String? = dependency.version
) : Dependency by dependency, Comparable {
@@ -52,7 +52,7 @@ internal class ModuleDependency(
.thenBy { it.factualVersion }
}
- override fun getVersion(): String = factualVersion
+ override fun getVersion(): String? = factualVersion
/**
* A project dependency with its [scope][DependencyScope].
diff --git a/buildSrc/src/main/kotlin/io/spine/gradle/report/pom/PomGenerator.kt b/buildSrc/src/main/kotlin/io/spine/gradle/report/pom/PomGenerator.kt
index fbbe024..9a40725 100644
--- a/buildSrc/src/main/kotlin/io/spine/gradle/report/pom/PomGenerator.kt
+++ b/buildSrc/src/main/kotlin/io/spine/gradle/report/pom/PomGenerator.kt
@@ -68,15 +68,17 @@ object PomGenerator {
fun applyTo(project: Project) {
/**
- * In some cases, the `base` plugin, which is by default is added by e.g. `java`,
- * is not yet added. `base` plugin defines the `build` task. This generator needs it.
+ * In some cases, the `base` plugin, which by default is added by e.g. `java`,
+ * is not yet added.
+ *
+ * The `base` plugin defines the `build` task.
+ * This generator needs it.
*/
project.apply {
plugin(BasePlugin::class.java)
}
- project.tasks.register("generatePom") {
- val generatePom = this
+ val task = project.tasks.register("generatePom") {
doLast {
val pomFile = project.projectDir.resolve("pom.xml")
project.delete(pomFile)
@@ -86,11 +88,11 @@ object PomGenerator {
writer.writeTo(pomFile)
}
- val buildTask = project.tasks.findByName("build")!!
- buildTask.finalizedBy(generatePom)
-
val assembleTask = project.tasks.findByName("assemble")!!
- generatePom.dependsOn(assembleTask)
+ dependsOn(assembleTask)
}
+
+ val buildTask = project.tasks.findByName("build")!!
+ buildTask.finalizedBy(task)
}
}
diff --git a/buildSrc/src/main/kotlin/io/spine/gradle/testing/Tasks.kt b/buildSrc/src/main/kotlin/io/spine/gradle/testing/Tasks.kt
index 971c4b4..30ac810 100644
--- a/buildSrc/src/main/kotlin/io/spine/gradle/testing/Tasks.kt
+++ b/buildSrc/src/main/kotlin/io/spine/gradle/testing/Tasks.kt
@@ -29,6 +29,7 @@ package io.spine.gradle.testing
import org.gradle.api.tasks.TaskContainer
import org.gradle.api.tasks.testing.Test
import org.gradle.kotlin.dsl.register
+import org.gradle.kotlin.dsl.withType
/**
* Registers [slowTest][SlowTest] and [fastTest][FastTest] tasks in this [TaskContainer].
@@ -45,10 +46,10 @@ import org.gradle.kotlin.dsl.register
*/
@Suppress("unused")
fun TaskContainer.registerTestTasks() {
- withType(Test::class.java).configureEach {
+ withType().configureEach {
filter {
- // There could be cases with no matching tests. E.g. tests could be based on Kotest,
- // which has custom task types and names.
+ // There could be cases with no matching tests.
+ // E.g., tests could be based on Kotest, which has custom task types and names.
isFailOnNoMatchingTests = false
includeTestsMatching("*Test")
includeTestsMatching("*Spec")
diff --git a/buildSrc/src/main/kotlin/jacoco-kmm-jvm.gradle.kts b/buildSrc/src/main/kotlin/jacoco-kmm-jvm.gradle.kts
new file mode 100644
index 0000000..de7f1bf
--- /dev/null
+++ b/buildSrc/src/main/kotlin/jacoco-kmm-jvm.gradle.kts
@@ -0,0 +1,72 @@
+/*
+ * 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.
+ */
+
+import java.io.File
+import org.gradle.kotlin.dsl.getValue
+import org.gradle.kotlin.dsl.getting
+import org.gradle.kotlin.dsl.jacoco
+import org.gradle.testing.jacoco.tasks.JacocoReport
+
+plugins {
+ jacoco
+}
+
+/**
+ * Configures [JacocoReport] task to run in a Kotlin KMM project for `commonMain` and `jvmMain`
+ * source sets.
+ *
+ * This script plugin must be applied using the following construct at the end of
+ * a `build.gradle.kts` file of a module:
+ *
+ * ```kotlin
+ * apply(plugin="jacoco-kmm-jvm")
+ * ```
+ * Please do not apply this script plugin in the `plugins {}` block because `jacocoTestReport`
+ * task is not yet available at this stage.
+ */
+@Suppress("unused")
+private val about = ""
+
+/**
+ * Configure the Jacoco task with custom input a KMM project
+ * to which this convention plugin is applied.
+ */
+@Suppress("unused")
+val jacocoTestReport: JacocoReport by tasks.getting(JacocoReport::class) {
+ val buildDir = project.layout.buildDirectory.get().asFile.absolutePath
+ val classFiles = File("${buildDir}/classes/kotlin/jvm/")
+ .walkBottomUp()
+ .toSet()
+ classDirectories.setFrom(classFiles)
+
+ val coverageSourceDirs = arrayOf(
+ "src/commonMain",
+ "src/jvmMain"
+ )
+ sourceDirectories.setFrom(files(coverageSourceDirs))
+
+ executionData.setFrom(files("${buildDir}/jacoco/jvmTest.exec"))
+}
diff --git a/buildSrc/src/main/kotlin/jvm-module.gradle.kts b/buildSrc/src/main/kotlin/jvm-module.gradle.kts
index 385a3a8..b1587a7 100644
--- a/buildSrc/src/main/kotlin/jvm-module.gradle.kts
+++ b/buildSrc/src/main/kotlin/jvm-module.gradle.kts
@@ -28,15 +28,11 @@ import BuildSettings.javaVersion
import io.spine.dependency.build.CheckerFramework
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.JavaX
import io.spine.dependency.lib.Protobuf
-import io.spine.dependency.local.Logging
import io.spine.dependency.local.Reflect
-import io.spine.dependency.local.TestLib
-import io.spine.dependency.test.JUnit
import io.spine.dependency.test.Jacoco
-import io.spine.dependency.test.Kotest
import io.spine.gradle.checkstyle.CheckStyleConfig
import io.spine.gradle.github.pages.updateGitHubPages
import io.spine.gradle.javac.configureErrorProne
@@ -45,13 +41,9 @@ import io.spine.gradle.javadoc.JavadocConfig
import io.spine.gradle.kotlin.applyJvmToolchain
import io.spine.gradle.kotlin.setFreeCompilerArgs
import io.spine.gradle.report.license.LicenseReporter
-import io.spine.gradle.testing.configureLogging
-import io.spine.gradle.testing.registerTestTasks
-import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins {
`java-library`
- idea
id("net.ltgt.errorprone")
id("pmd-settings")
id("project-report")
@@ -75,7 +67,6 @@ project.run {
val generatedDir = "$projectDir/generated"
setTaskDependencies(generatedDir)
- setupTests()
configureGitHubPages()
}
@@ -99,23 +90,26 @@ fun Module.configureKotlin(javaVersion: JavaLanguageVersion) {
kotlin {
applyJvmToolchain(javaVersion.asInt())
explicitApi()
- }
-
- tasks {
- withType().configureEach {
- kotlinOptions.jvmTarget = javaVersion.toString()
+ compilerOptions {
+ jvmTarget.set(BuildSettings.jvmTarget)
setFreeCompilerArgs()
}
}
- kover {
- useJacoco(version = Jacoco.version)
+ // See:
+ // https://github.com/Kotlin/kotlinx-kover?tab=readme-ov-file#to-create-report-combining-coverage-info-from-different-gradle-projects
+ // https://github.com/Kotlin/kotlinx-kover/blob/main/kover-gradle-plugin/examples/jvm/merged/build.gradle.kts
+ rootProject.dependencies {
+ kover(this@configureKotlin)
}
- koverReport {
- defaults {
- xml {
- onCheck = true
+ kover {
+ useJacoco(version = Jacoco.version)
+ reports {
+ total {
+ xml {
+ onCheck = true
+ }
}
}
}
@@ -135,21 +129,8 @@ fun Module.addDependencies() = dependencies {
api(Guava.lib)
compileOnlyApi(CheckerFramework.annotations)
- compileOnlyApi(JavaX.annotations)
+ api(JSpecify.annotations)
ErrorProne.annotations.forEach { compileOnlyApi(it) }
-
- implementation(Logging.lib)
-
- testImplementation(Guava.testLib)
- testImplementation(JUnit.runner)
- testImplementation(JUnit.pioneer)
- JUnit.api.forEach { testImplementation(it) }
-
- testImplementation(TestLib.lib)
- testImplementation(Kotest.frameworkEngine)
- testImplementation(Kotest.datatest)
- testImplementation(Kotest.runnerJUnit5Jvm)
- testImplementation(JUnit.runner)
}
fun Module.forceConfigurations() {
@@ -159,8 +140,6 @@ fun Module.forceConfigurations() {
all {
resolutionStrategy {
force(
- JUnit.bom,
- JUnit.runner,
Dokka.BasePlugin.lib,
Reflect.lib,
)
@@ -169,18 +148,6 @@ fun Module.forceConfigurations() {
}
}
-fun Module.setupTests() {
- tasks {
- registerTestTasks()
- test.configure {
- useJUnitPlatform {
- includeEngines("junit-jupiter")
- }
- configureLogging()
- }
- }
-}
-
fun Module.setTaskDependencies(generatedDir: String) {
tasks {
val cleanGenerated by registering(Delete::class) {
@@ -195,7 +162,9 @@ fun Module.setTaskDependencies(generatedDir: String) {
publish?.dependsOn("${project.path}:updateGitHubPages")
}
}
- configureTaskDependencies()
+ afterEvaluate {
+ configureTaskDependencies()
+ }
}
fun Module.configureGitHubPages() {
diff --git a/buildSrc/src/main/kotlin/module-testing.gradle.kts b/buildSrc/src/main/kotlin/module-testing.gradle.kts
new file mode 100644
index 0000000..715852c
--- /dev/null
+++ b/buildSrc/src/main/kotlin/module-testing.gradle.kts
@@ -0,0 +1,121 @@
+/*
+ * 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.
+ */
+
+import io.spine.dependency.lib.Guava
+import io.spine.dependency.local.TestLib
+import io.spine.dependency.test.JUnit
+import io.spine.dependency.test.JUnit.Jupiter
+import io.spine.dependency.test.Kotest
+import io.spine.dependency.test.Truth
+import io.spine.gradle.testing.configureLogging
+import io.spine.gradle.testing.registerTestTasks
+
+/**
+ * This convention plugin applies test dependencies and configures test-related tasks.
+ *
+ * The version of the [JUnit] platform must be applied via the [BomsPlugin][io.spine.dependency.boms.BomsPlugin]:
+ *
+ * ```kotlin
+ * apply()
+ * ```
+ */
+@Suppress("unused")
+private val about = ""
+
+plugins {
+ `java-library`
+}
+
+project.run {
+ setupTests()
+ forceTestDependencies()
+}
+
+dependencies {
+ forceJunitPlatform()
+
+ testImplementation(Jupiter.api)
+ testImplementation(Jupiter.params)
+ testImplementation(JUnit.pioneer)
+
+ testImplementation(Guava.testLib)
+
+ testImplementation(TestLib.lib)
+ testImplementation(Kotest.assertions)
+ testImplementation(Kotest.datatest)
+
+ testRuntimeOnly(Jupiter.engine)
+}
+
+/**
+ * Forces the version of [JUnit] platform and its dependencies via [JUnit.bom].
+ */
+private fun DependencyHandlerScope.forceJunitPlatform() {
+ testImplementation(enforcedPlatform(JUnit.bom))
+}
+
+typealias Module = Project
+
+/**
+ * Configure this module to run JUnit-based tests.
+ */
+fun Module.setupTests() {
+ tasks {
+ registerTestTasks()
+ test.configure {
+ useJUnitPlatform {
+ includeEngines("junit-jupiter")
+ }
+ configureLogging()
+ }
+ }
+}
+
+/**
+ * Forces the versions of task dependencies that are used _in addition_ to
+ * the forced JUnit platform.
+ */
+@Suppress(
+ /* We're OK with incubating API for configurations. It does not seem to change recently. */
+ "UnstableApiUsage"
+)
+fun Module.forceTestDependencies() {
+ configurations {
+ all {
+ resolutionStrategy {
+ forceTestDependencies()
+ }
+ }
+ }
+}
+
+private fun ResolutionStrategy.forceTestDependencies() {
+ force(
+ Guava.testLib,
+ Truth.libs,
+ Kotest.assertions,
+ )
+}
diff --git a/buildSrc/src/main/kotlin/module.gradle.kts b/buildSrc/src/main/kotlin/module.gradle.kts
index 629d142..f6970c7 100644
--- a/buildSrc/src/main/kotlin/module.gradle.kts
+++ b/buildSrc/src/main/kotlin/module.gradle.kts
@@ -24,37 +24,29 @@
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
+import io.spine.dependency.boms.BomsPlugin
import io.spine.dependency.build.CheckerFramework
import io.spine.dependency.build.ErrorProne
import io.spine.dependency.build.FindBugs
-import io.spine.dependency.lib.Coroutines
-import io.spine.dependency.lib.Guava
-import io.spine.dependency.lib.Jackson
-import io.spine.dependency.lib.Kotlin
import io.spine.dependency.local.ArtifactVersion
import io.spine.dependency.local.Base
-import io.spine.dependency.local.Spine
import io.spine.dependency.local.Logging
-import io.spine.dependency.test.JUnit
-import io.spine.dependency.test.Kotest
-import io.spine.dependency.test.Truth
+import io.spine.dependency.local.Spine
+import io.spine.dependency.local.ToolBase
import io.spine.gradle.VersionWriter
import io.spine.gradle.checkstyle.CheckStyleConfig
import io.spine.gradle.github.pages.updateGitHubPages
import io.spine.gradle.javac.configureErrorProne
import io.spine.gradle.javac.configureJavac
import io.spine.gradle.javadoc.JavadocConfig
-import io.spine.gradle.kotlin.applyJvmToolchain
import io.spine.gradle.kotlin.setFreeCompilerArgs
import io.spine.gradle.publish.IncrementGuard
import io.spine.gradle.report.license.LicenseReporter
-import io.spine.gradle.testing.configureLogging
-import io.spine.gradle.testing.registerTestTasks
-import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins {
`java-library`
kotlin("jvm")
+ id("module-testing")
id("net.ltgt.errorprone")
id("detekt-code-analysis")
id("pmd-settings")
@@ -63,6 +55,7 @@ plugins {
`project-report`
idea
}
+apply()
apply()
apply()
@@ -74,11 +67,8 @@ project.run {
addDependencies()
forceConfigurations()
- val javaVersion = JavaLanguageVersion.of(11)
- configureJava(javaVersion)
- configureKotlin(javaVersion)
-
- configureTests()
+ configureJava(BuildSettings.javaVersion)
+ configureKotlin()
configureGitHubPages()
configureTaskDependencies()
@@ -93,12 +83,6 @@ fun Module.addDependencies() {
compileOnlyApi(FindBugs.annotations)
compileOnlyApi(CheckerFramework.annotations)
ErrorProne.annotations.forEach { compileOnlyApi(it) }
-
- testImplementation(Guava.testLib)
- JUnit.api.forEach { testImplementation(it) }
- Truth.libs.forEach { testImplementation(it) }
- testImplementation(Kotest.assertions)
- testRuntimeOnly(JUnit.runner)
}
}
@@ -110,14 +94,8 @@ fun Module.forceConfigurations() {
resolutionStrategy {
@Suppress("DEPRECATION") // To force `Kotlin.stdLibJdk7` version.
force(
- Kotlin.stdLibJdk7,
- JUnit.runner,
- Coroutines.jdk8,
- Coroutines.core,
- Coroutines.bom,
- Coroutines.coreJvm,
- Jackson.Junior.objects,
Base.lib,
+ ToolBase.pluginBase,
Spine.reflect,
Logging.lib,
)
@@ -138,32 +116,16 @@ fun Module.configureJava(javaVersion: JavaLanguageVersion) {
}
}
-fun Module.configureKotlin(javaVersion: JavaLanguageVersion) {
+fun Module.configureKotlin() {
kotlin {
- applyJvmToolchain(javaVersion.asInt())
explicitApi()
- }
-
- tasks {
- withType().configureEach {
- kotlinOptions.jvmTarget = javaVersion.toString()
+ compilerOptions {
+ jvmTarget.set(BuildSettings.jvmTarget)
setFreeCompilerArgs()
}
}
}
-fun Module.configureTests() {
- tasks {
- registerTestTasks()
- test.configure {
- useJUnitPlatform {
- includeEngines("junit-jupiter")
- }
- configureLogging()
- }
- }
-}
-
fun Module.configureGitHubPages() {
updateGitHubPages(ArtifactVersion.javadocTools) {
allowInternalJavadoc.set(true)
diff --git a/config b/config
index d3f2e69..5181e61 160000
--- a/config
+++ b/config
@@ -1 +1 @@
-Subproject commit d3f2e696f3de878d19f7c635107620becb7829f1
+Subproject commit 5181e61ffeb5640b5b558b1df015e7462fd5a508
diff --git a/dependencies.md b/dependencies.md
index 150a35d..7968b15 100644
--- a/dependencies.md
+++ b/dependencies.md
@@ -1,25 +1,25 @@
-# Dependencies of `io.spine.tools:prototap-api:0.9.1`
+# Dependencies of `io.spine.tools:prototap-api:0.10.0`
## Runtime
1. **Group** : com.google.code.findbugs. **Name** : jsr305. **Version** : 3.0.2.
* **Project URL:** [http://findbugs.sourceforge.net/](http://findbugs.sourceforge.net/)
* **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : com.google.code.gson. **Name** : gson. **Version** : 2.10.1.
- * **Project URL:** [https://github.com/google/gson/gson](https://github.com/google/gson/gson)
+1. **Group** : com.google.code.gson. **Name** : gson. **Version** : 2.13.0.
+ * **Project URL:** [https://github.com/google/gson](https://github.com/google/gson)
* **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : com.google.errorprone. **Name** : error_prone_annotations. **Version** : 2.23.0.
+1. **Group** : com.google.errorprone. **Name** : error_prone_annotations. **Version** : 2.36.0.
* **Project URL:** [https://errorprone.info/error_prone_annotations](https://errorprone.info/error_prone_annotations)
* **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : com.google.guava. **Name** : failureaccess. **Version** : 1.0.1.
+1. **Group** : com.google.guava. **Name** : failureaccess. **Version** : 1.0.3.
* **Project URL:** [https://github.com/google/guava/](https://github.com/google/guava/)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+ * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : com.google.guava. **Name** : guava. **Version** : 32.1.3-jre.
+1. **Group** : com.google.guava. **Name** : guava. **Version** : 33.4.8-jre.
* **Project URL:** [https://github.com/google/guava](https://github.com/google/guava)
* **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
@@ -30,59 +30,56 @@
* **Project URL:** [https://github.com/google/j2objc/](https://github.com/google/j2objc/)
* **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : com.google.protobuf. **Name** : protobuf-java. **Version** : 3.25.1.
+1. **Group** : com.google.protobuf. **Name** : protobuf-java. **Version** : 3.25.7.
* **Project URL:** [https://developers.google.com/protocol-buffers/](https://developers.google.com/protocol-buffers/)
* **License:** [BSD-3-Clause](https://opensource.org/licenses/BSD-3-Clause)
-1. **Group** : com.google.protobuf. **Name** : protobuf-java-util. **Version** : 3.25.1.
+1. **Group** : com.google.protobuf. **Name** : protobuf-java-util. **Version** : 3.25.7.
* **Project URL:** [https://developers.google.com/protocol-buffers/](https://developers.google.com/protocol-buffers/)
* **License:** [BSD-3-Clause](https://opensource.org/licenses/BSD-3-Clause)
-1. **Group** : com.google.protobuf. **Name** : protobuf-kotlin. **Version** : 3.25.1.
+1. **Group** : com.google.protobuf. **Name** : protobuf-kotlin. **Version** : 3.25.7.
+ * **Project URL:** [https://developers.google.com/protocol-buffers/](https://developers.google.com/protocol-buffers/)
* **License:** [BSD-3-Clause](https://opensource.org/licenses/BSD-3-Clause)
-1. **Group** : org.checkerframework. **Name** : checker-qual. **Version** : 3.40.0.
- * **Project URL:** [https://checkerframework.org/](https://checkerframework.org/)
- * **License:** [The MIT License](http://opensource.org/licenses/MIT)
-
-1. **Group** : org.jetbrains. **Name** : annotations. **Version** : 24.0.1.
+1. **Group** : org.jetbrains. **Name** : annotations. **Version** : 26.0.2.
* **Project URL:** [https://github.com/JetBrains/java-annotations](https://github.com/JetBrains/java-annotations)
* **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-reflect. **Version** : 1.9.24.
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-bom. **Version** : 2.1.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-reflect. **Version** : 2.1.20.
* **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
* **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib. **Version** : 1.9.24.
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib. **Version** : 2.1.20.
* **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
* **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib-jdk7. **Version** : 1.9.24.
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib-jdk7. **Version** : 2.1.20.
* **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
* **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib-jdk8. **Version** : 1.9.24.
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib-jdk8. **Version** : 2.1.20.
* **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
* **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-coroutines-bom. **Version** : 1.10.2.
+ * **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines)
+ * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jspecify. **Name** : jspecify. **Version** : 1.0.0.
+ * **Project URL:** [http://jspecify.org/](http://jspecify.org/)
+ * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
1. **Group** : org.ow2.asm. **Name** : asm. **Version** : 9.6.
* **Project URL:** [http://asm.ow2.io/](http://asm.ow2.io/)
* **License:** [BSD-3-Clause](https://asm.ow2.io/license.html)
* **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
## Compile, tests, and tooling
-1. **Group** : aopalliance. **Name** : aopalliance. **Version** : 1.0.
- * **Project URL:** [http://aopalliance.sourceforge.net](http://aopalliance.sourceforge.net)
- * **License:** Public Domain
-
-1. **Group** : com.beust. **Name** : jcommander. **Version** : 1.48.
- * **Project URL:** [http://beust.com/jcommander](http://beust.com/jcommander)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.beust. **Name** : jcommander. **Version** : 1.82.
- * **Project URL:** [https://jcommander.org](https://jcommander.org)
- * **License:** [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
1. **Group** : com.github.ben-manes.caffeine. **Name** : caffeine. **Version** : 3.0.5.
* **Project URL:** [https://github.com/ben-manes/caffeine](https://github.com/ben-manes/caffeine)
* **License:** [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
@@ -91,6 +88,10 @@
* **Project URL:** [https://www.github.com/KevinStern/software-and-algorithms](https://www.github.com/KevinStern/software-and-algorithms)
* **License:** [MIT License](http://www.opensource.org/licenses/mit-license.php)
+1. **Group** : com.github.oowekyala.ooxml. **Name** : nice-xml-messages. **Version** : 3.1.
+ * **Project URL:** [https://github.com/oowekyala/nice-xml-messages](https://github.com/oowekyala/nice-xml-messages)
+ * **License:** [MIT License](https://github.com/oowekyala/nice-xml-messages/tree/master/LICENSE)
+
1. **Group** : com.google.auto. **Name** : auto-common. **Version** : 1.2.2.
* **Project URL:** [https://github.com/google/auto/tree/main/common](https://github.com/google/auto/tree/main/common)
* **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
@@ -107,27 +108,27 @@
* **Project URL:** [http://findbugs.sourceforge.net/](http://findbugs.sourceforge.net/)
* **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : com.google.code.gson. **Name** : gson. **Version** : 2.10.1.
- * **Project URL:** [https://github.com/google/gson/gson](https://github.com/google/gson/gson)
+1. **Group** : com.google.code.gson. **Name** : gson. **Version** : 2.13.0.
+ * **Project URL:** [https://github.com/google/gson](https://github.com/google/gson)
* **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : com.google.errorprone. **Name** : error_prone_annotation. **Version** : 2.23.0.
+1. **Group** : com.google.errorprone. **Name** : error_prone_annotation. **Version** : 2.36.0.
* **Project URL:** [https://errorprone.info/error_prone_annotation](https://errorprone.info/error_prone_annotation)
* **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : com.google.errorprone. **Name** : error_prone_annotations. **Version** : 2.23.0.
+1. **Group** : com.google.errorprone. **Name** : error_prone_annotations. **Version** : 2.36.0.
* **Project URL:** [https://errorprone.info/error_prone_annotations](https://errorprone.info/error_prone_annotations)
* **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : com.google.errorprone. **Name** : error_prone_check_api. **Version** : 2.23.0.
+1. **Group** : com.google.errorprone. **Name** : error_prone_check_api. **Version** : 2.36.0.
* **Project URL:** [https://errorprone.info/error_prone_check_api](https://errorprone.info/error_prone_check_api)
* **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : com.google.errorprone. **Name** : error_prone_core. **Version** : 2.23.0.
+1. **Group** : com.google.errorprone. **Name** : error_prone_core. **Version** : 2.36.0.
* **Project URL:** [https://errorprone.info/error_prone_core](https://errorprone.info/error_prone_core)
* **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : com.google.errorprone. **Name** : error_prone_type_annotations. **Version** : 2.23.0.
+1. **Group** : com.google.errorprone. **Name** : error_prone_type_annotations. **Version** : 2.36.0.
* **Project URL:** [https://errorprone.info/error_prone_type_annotations](https://errorprone.info/error_prone_type_annotations)
* **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
@@ -135,49 +136,57 @@
* **Project URL:** [https://github.com/google/error-prone-javac](https://github.com/google/error-prone-javac)
* **License:** [GNU General Public License, version 2, with the Classpath Exception](http://openjdk.java.net/legal/gplv2+ce.html)
-1. **Group** : com.google.guava. **Name** : failureaccess. **Version** : 1.0.1.
- * **Project URL:** [https://github.com/google/guava/](https://github.com/google/guava/)
+1. **Group** : com.google.flogger. **Name** : flogger. **Version** : 0.7.4.
+ * **Project URL:** [https://github.com/google/flogger](https://github.com/google/flogger)
+ * **License:** [Apache 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.flogger. **Name** : flogger-system-backend. **Version** : 0.7.4.
+ * **Project URL:** [https://github.com/google/flogger](https://github.com/google/flogger)
+ * **License:** [Apache 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.googlejavaformat. **Name** : google-java-format. **Version** : 1.19.1.
* **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : com.google.guava. **Name** : guava. **Version** : 32.1.3-jre.
+1. **Group** : com.google.guava. **Name** : failureaccess. **Version** : 1.0.3.
+ * **Project URL:** [https://github.com/google/guava/](https://github.com/google/guava/)
+ * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.guava. **Name** : guava. **Version** : 33.4.8-jre.
* **Project URL:** [https://github.com/google/guava](https://github.com/google/guava)
* **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : com.google.guava. **Name** : guava-testlib. **Version** : 32.1.3-jre.
+1. **Group** : com.google.guava. **Name** : guava-testlib. **Version** : 33.4.8-jre.
* **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
1. **Group** : com.google.guava. **Name** : listenablefuture. **Version** : 9999.0-empty-to-avoid-conflict-with-guava.
* **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : com.google.inject. **Name** : guice. **Version** : 5.1.0.
- * **Project URL:** [https://github.com/google/guice](https://github.com/google/guice)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
1. **Group** : com.google.j2objc. **Name** : j2objc-annotations. **Version** : 2.8.
* **Project URL:** [https://github.com/google/j2objc/](https://github.com/google/j2objc/)
* **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : com.google.protobuf. **Name** : protobuf-java. **Version** : 3.25.1.
+1. **Group** : com.google.protobuf. **Name** : protobuf-java. **Version** : 3.25.7.
* **Project URL:** [https://developers.google.com/protocol-buffers/](https://developers.google.com/protocol-buffers/)
* **License:** [BSD-3-Clause](https://opensource.org/licenses/BSD-3-Clause)
-1. **Group** : com.google.protobuf. **Name** : protobuf-java-util. **Version** : 3.25.1.
+1. **Group** : com.google.protobuf. **Name** : protobuf-java-util. **Version** : 3.25.7.
* **Project URL:** [https://developers.google.com/protocol-buffers/](https://developers.google.com/protocol-buffers/)
* **License:** [BSD-3-Clause](https://opensource.org/licenses/BSD-3-Clause)
-1. **Group** : com.google.protobuf. **Name** : protobuf-kotlin. **Version** : 3.25.1.
+1. **Group** : com.google.protobuf. **Name** : protobuf-kotlin. **Version** : 3.25.7.
+ * **Project URL:** [https://developers.google.com/protocol-buffers/](https://developers.google.com/protocol-buffers/)
* **License:** [BSD-3-Clause](https://opensource.org/licenses/BSD-3-Clause)
-1. **Group** : com.google.truth. **Name** : truth. **Version** : 1.1.5.
+1. **Group** : com.google.truth. **Name** : truth. **Version** : 1.4.4.
* **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : com.google.truth.extensions. **Name** : truth-java8-extension. **Version** : 1.1.5.
+1. **Group** : com.google.truth.extensions. **Name** : truth-java8-extension. **Version** : 1.4.4.
* **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : com.google.truth.extensions. **Name** : truth-liteproto-extension. **Version** : 1.1.5.
+1. **Group** : com.google.truth.extensions. **Name** : truth-liteproto-extension. **Version** : 1.4.4.
* **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : com.google.truth.extensions. **Name** : truth-proto-extension. **Version** : 1.1.5.
+1. **Group** : com.google.truth.extensions. **Name** : truth-proto-extension. **Version** : 1.4.4.
* **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
1. **Group** : com.puppycrawl.tools. **Name** : checkstyle. **Version** : 10.12.1.
@@ -196,6 +205,14 @@
* **Project URL:** [http://commons.apache.org/collections/](http://commons.apache.org/collections/)
* **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+1. **Group** : dev.drewhamilton.poko. **Name** : poko-annotations. **Version** : 0.17.1.
+ * **Project URL:** [https://github.com/drewhamilton/Poko](https://github.com/drewhamilton/Poko)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : dev.drewhamilton.poko. **Name** : poko-annotations-jvm. **Version** : 0.17.1.
+ * **Project URL:** [https://github.com/drewhamilton/Poko](https://github.com/drewhamilton/Poko)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
1. **Group** : info.picocli. **Name** : picocli. **Version** : 4.7.4.
* **Project URL:** [https://picocli.info](https://picocli.info)
* **License:** [The Apache Software License, version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
@@ -204,187 +221,197 @@
* **Project URL:** [https://github.com/davidburstrom/contester](https://github.com/davidburstrom/contester)
* **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : io.github.detekt.sarif4k. **Name** : sarif4k. **Version** : 0.4.0.
+1. **Group** : io.github.detekt.sarif4k. **Name** : sarif4k. **Version** : 0.6.0.
* **Project URL:** [https://detekt.github.io/detekt](https://detekt.github.io/detekt)
* **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : io.github.detekt.sarif4k. **Name** : sarif4k-jvm. **Version** : 0.4.0.
+1. **Group** : io.github.detekt.sarif4k. **Name** : sarif4k-jvm. **Version** : 0.6.0.
* **Project URL:** [https://detekt.github.io/detekt](https://detekt.github.io/detekt)
* **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : io.github.eisop. **Name** : dataflow-errorprone. **Version** : 3.34.0-eisop1.
+1. **Group** : io.github.eisop. **Name** : dataflow-errorprone. **Version** : 3.41.0-eisop1.
* **Project URL:** [https://eisop.github.io/](https://eisop.github.io/)
* **License:** [GNU General Public License, version 2 (GPL2), with the classpath exception](http://www.gnu.org/software/classpath/license.html)
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.gitlab.arturbosch.detekt. **Name** : detekt-api. **Version** : 1.23.0.
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-api. **Version** : 1.23.8.
* **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.gitlab.arturbosch.detekt. **Name** : detekt-cli. **Version** : 1.23.0.
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-cli. **Version** : 1.23.8.
* **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.gitlab.arturbosch.detekt. **Name** : detekt-core. **Version** : 1.23.0.
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-core. **Version** : 1.23.8.
* **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.gitlab.arturbosch.detekt. **Name** : detekt-metrics. **Version** : 1.23.0.
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-metrics. **Version** : 1.23.8.
* **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.gitlab.arturbosch.detekt. **Name** : detekt-parser. **Version** : 1.23.0.
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-parser. **Version** : 1.23.8.
* **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.gitlab.arturbosch.detekt. **Name** : detekt-psi-utils. **Version** : 1.23.0.
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-psi-utils. **Version** : 1.23.8.
* **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.gitlab.arturbosch.detekt. **Name** : detekt-report-html. **Version** : 1.23.0.
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-report-html. **Version** : 1.23.8.
* **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.gitlab.arturbosch.detekt. **Name** : detekt-report-md. **Version** : 1.23.0.
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-report-md. **Version** : 1.23.8.
* **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.gitlab.arturbosch.detekt. **Name** : detekt-report-sarif. **Version** : 1.23.0.
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-report-sarif. **Version** : 1.23.8.
* **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.gitlab.arturbosch.detekt. **Name** : detekt-report-txt. **Version** : 1.23.0.
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-report-txt. **Version** : 1.23.8.
* **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.gitlab.arturbosch.detekt. **Name** : detekt-report-xml. **Version** : 1.23.0.
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-report-xml. **Version** : 1.23.8.
* **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.gitlab.arturbosch.detekt. **Name** : detekt-rules. **Version** : 1.23.0.
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-rules. **Version** : 1.23.8.
* **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.gitlab.arturbosch.detekt. **Name** : detekt-rules-complexity. **Version** : 1.23.0.
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-rules-complexity. **Version** : 1.23.8.
* **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.gitlab.arturbosch.detekt. **Name** : detekt-rules-coroutines. **Version** : 1.23.0.
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-rules-coroutines. **Version** : 1.23.8.
* **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.gitlab.arturbosch.detekt. **Name** : detekt-rules-documentation. **Version** : 1.23.0.
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-rules-documentation. **Version** : 1.23.8.
* **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.gitlab.arturbosch.detekt. **Name** : detekt-rules-empty. **Version** : 1.23.0.
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-rules-empty. **Version** : 1.23.8.
* **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.gitlab.arturbosch.detekt. **Name** : detekt-rules-errorprone. **Version** : 1.23.0.
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-rules-errorprone. **Version** : 1.23.8.
* **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.gitlab.arturbosch.detekt. **Name** : detekt-rules-exceptions. **Version** : 1.23.0.
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-rules-exceptions. **Version** : 1.23.8.
* **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.gitlab.arturbosch.detekt. **Name** : detekt-rules-naming. **Version** : 1.23.0.
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-rules-naming. **Version** : 1.23.8.
* **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.gitlab.arturbosch.detekt. **Name** : detekt-rules-performance. **Version** : 1.23.0.
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-rules-performance. **Version** : 1.23.8.
* **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.gitlab.arturbosch.detekt. **Name** : detekt-rules-style. **Version** : 1.23.0.
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-rules-style. **Version** : 1.23.8.
* **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.gitlab.arturbosch.detekt. **Name** : detekt-tooling. **Version** : 1.23.0.
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-tooling. **Version** : 1.23.8.
* **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.gitlab.arturbosch.detekt. **Name** : detekt-utils. **Version** : 1.23.0.
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-utils. **Version** : 1.23.8.
* **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-api. **Version** : 5.8.0.
+1. **Group** : io.kotest. **Name** : kotest-assertions-api. **Version** : 5.9.1.
* **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-api-jvm. **Version** : 5.8.0.
+1. **Group** : io.kotest. **Name** : kotest-assertions-api-jvm. **Version** : 5.9.1.
* **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. **Version** : 5.8.0.
+1. **Group** : io.kotest. **Name** : kotest-assertions-core. **Version** : 5.9.1.
* **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** : 5.8.0.
+1. **Group** : io.kotest. **Name** : kotest-assertions-core-jvm. **Version** : 5.9.1.
* **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** : 5.8.0.
+1. **Group** : io.kotest. **Name** : kotest-assertions-shared. **Version** : 5.9.1.
* **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** : 5.8.0.
+1. **Group** : io.kotest. **Name** : kotest-assertions-shared-jvm. **Version** : 5.9.1.
* **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** : 5.8.0.
+1. **Group** : io.kotest. **Name** : kotest-common. **Version** : 5.9.1.
* **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** : 5.8.0.
+1. **Group** : io.kotest. **Name** : kotest-common-jvm. **Version** : 5.9.1.
* **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** : javax.annotation. **Name** : javax.annotation-api. **Version** : 1.3.2.
- * **Project URL:** [http://jcp.org/en/jsr/detail?id=250](http://jcp.org/en/jsr/detail?id=250)
- * **License:** [CDDL + GPLv2 with classpath exception](https://github.com/javaee/javax.annotation/blob/master/LICENSE)
+1. **Group** : io.kotest. **Name** : kotest-framework-api. **Version** : 5.9.1.
+ * **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-framework-api-jvm. **Version** : 5.9.1.
+ * **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-framework-datatest. **Version** : 5.9.1.
+ * **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-framework-datatest-jvm. **Version** : 5.9.1.
+ * **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** : javax.inject. **Name** : javax.inject. **Version** : 1.
* **Project URL:** [http://code.google.com/p/atinject/](http://code.google.com/p/atinject/)
* **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : junit. **Name** : junit. **Version** : 4.13.1.
+1. **Group** : junit. **Name** : junit. **Version** : 4.13.2.
* **Project URL:** [http://junit.org](http://junit.org)
* **License:** [Eclipse Public License 1.0](http://www.eclipse.org/legal/epl-v10.html)
-1. **Group** : net.java.dev.jna. **Name** : jna. **Version** : 5.6.0.
- * **Project URL:** [https://github.com/java-native-access/jna](https://github.com/java-native-access/jna)
- * **License:** [Apache License v2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
- * **License:** [LGPL, version 2.1](http://www.gnu.org/licenses/licenses.html)
-
1. **Group** : net.sf.saxon. **Name** : Saxon-HE. **Version** : 12.2.
* **Project URL:** [http://www.saxonica.com/](http://www.saxonica.com/)
* **License:** [Mozilla Public License Version 2.0](http://www.mozilla.org/MPL/2.0/)
-1. **Group** : net.sourceforge.pmd. **Name** : pmd-core. **Version** : 6.55.0.
+1. **Group** : net.sf.saxon. **Name** : Saxon-HE. **Version** : 12.5.
+ * **Project URL:** [http://www.saxonica.com/](http://www.saxonica.com/)
+ * **License:** [Mozilla Public License Version 2.0](http://www.mozilla.org/MPL/2.0/)
+
+1. **Group** : net.sourceforge.pmd. **Name** : pmd-ant. **Version** : 7.12.0.
* **License:** [BSD-style](http://pmd.sourceforge.net/license.html)
-1. **Group** : net.sourceforge.pmd. **Name** : pmd-java. **Version** : 6.55.0.
+1. **Group** : net.sourceforge.pmd. **Name** : pmd-core. **Version** : 7.12.0.
* **License:** [BSD-style](http://pmd.sourceforge.net/license.html)
-1. **Group** : net.sourceforge.saxon. **Name** : saxon. **Version** : 9.1.0.8.
- * **Project URL:** [http://saxon.sourceforge.net/](http://saxon.sourceforge.net/)
- * **License:** [Mozilla Public License Version 1.0](http://www.mozilla.org/MPL/MPL-1.0.txt)
+1. **Group** : net.sourceforge.pmd. **Name** : pmd-java. **Version** : 7.12.0.
+ * **License:** [BSD-style](http://pmd.sourceforge.net/license.html)
1. **Group** : org.antlr. **Name** : antlr4-runtime. **Version** : 4.11.1.
* **Project URL:** [https://www.antlr.org/](https://www.antlr.org/)
* **License:** [BSD-3-Clause](https://www.antlr.org/license.html)
-1. **Group** : org.antlr. **Name** : antlr4-runtime. **Version** : 4.7.2.
+1. **Group** : org.antlr. **Name** : antlr4-runtime. **Version** : 4.9.3.
* **Project URL:** [http://www.antlr.org](http://www.antlr.org)
* **License:** [The BSD License](http://www.antlr.org/license.html)
-1. **Group** : org.apache.commons. **Name** : commons-lang3. **Version** : 3.8.1.
- * **Project URL:** [http://commons.apache.org/proper/commons-lang/](http://commons.apache.org/proper/commons-lang/)
- * **License:** [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+1. **Group** : org.apache.commons. **Name** : commons-lang3. **Version** : 3.17.0.
+ * **Project URL:** [https://commons.apache.org/proper/commons-lang/](https://commons.apache.org/proper/commons-lang/)
+ * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
1. **Group** : org.apache.httpcomponents.client5. **Name** : httpclient5. **Version** : 5.1.3.
* **License:** [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
@@ -399,17 +426,22 @@
* **Project URL:** [https://github.com/apiguardian-team/apiguardian](https://github.com/apiguardian-team/apiguardian)
* **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+1. **Group** : org.checkerframework. **Name** : checker-compat-qual. **Version** : 2.5.3.
+ * **Project URL:** [https://checkerframework.org](https://checkerframework.org)
+ * **License:** [GNU General Public License, version 2 (GPL2), with the classpath exception](http://www.gnu.org/software/classpath/license.html)
+ * **License:** [The MIT License](http://opensource.org/licenses/MIT)
+
1. **Group** : org.checkerframework. **Name** : checker-qual. **Version** : 3.40.0.
* **Project URL:** [https://checkerframework.org/](https://checkerframework.org/)
* **License:** [The MIT License](http://opensource.org/licenses/MIT)
-1. **Group** : org.hamcrest. **Name** : hamcrest. **Version** : 2.2.
+1. **Group** : org.hamcrest. **Name** : hamcrest. **Version** : 3.0.
* **Project URL:** [http://hamcrest.org/JavaHamcrest/](http://hamcrest.org/JavaHamcrest/)
- * **License:** [BSD License 3](http://opensource.org/licenses/BSD-3-Clause)
+ * **License:** [BSD-3-Clause](https://raw.githubusercontent.com/hamcrest/JavaHamcrest/master/LICENSE)
-1. **Group** : org.hamcrest. **Name** : hamcrest-core. **Version** : 2.2.
+1. **Group** : org.hamcrest. **Name** : hamcrest-core. **Version** : 3.0.
* **Project URL:** [http://hamcrest.org/JavaHamcrest/](http://hamcrest.org/JavaHamcrest/)
- * **License:** [BSD License 3](http://opensource.org/licenses/BSD-3-Clause)
+ * **License:** [BSD-3-Clause](https://raw.githubusercontent.com/hamcrest/JavaHamcrest/master/LICENSE)
1. **Group** : org.jacoco. **Name** : org.jacoco.agent. **Version** : 0.8.12.
* **License:** [EPL-2.0](https://www.eclipse.org/legal/epl-2.0/)
@@ -429,7 +461,11 @@
* **License:** [LGPL 2.1](http://www.gnu.org/licenses/lgpl-2.1.html)
* **License:** [MPL 1.1](http://www.mozilla.org/MPL/MPL-1.1.html)
-1. **Group** : org.jetbrains. **Name** : annotations. **Version** : 24.0.1.
+1. **Group** : org.jcommander. **Name** : jcommander. **Version** : 1.85.
+ * **Project URL:** [https://jcommander.org](https://jcommander.org)
+ * **License:** [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains. **Name** : annotations. **Version** : 26.0.2.
* **Project URL:** [https://github.com/JetBrains/java-annotations](https://github.com/JetBrains/java-annotations)
* **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
@@ -437,89 +473,141 @@
* **Project URL:** [https://github.com/JetBrains/intellij-deps-trove4j](https://github.com/JetBrains/intellij-deps-trove4j)
* **License:** [GNU LESSER GENERAL PUBLIC LICENSE 2.1](https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html)
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-compiler-embeddable. **Version** : 1.8.21.
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-bom. **Version** : 2.1.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-build-tools-api. **Version** : 2.1.20.
* **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
* **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-compiler-embeddable. **Version** : 1.8.22.
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-build-tools-impl. **Version** : 2.1.20.
* **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
* **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-daemon-embeddable. **Version** : 1.8.21.
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-compiler-embeddable. **Version** : 2.0.21.
* **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
* **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-daemon-embeddable. **Version** : 1.8.22.
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-compiler-embeddable. **Version** : 2.1.20.
* **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
* **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-klib-commonizer-embeddable. **Version** : 1.8.22.
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-compiler-runner. **Version** : 2.1.20.
* **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
* **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-reflect. **Version** : 1.9.24.
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-daemon-client. **Version** : 2.1.20.
* **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
* **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-script-runtime. **Version** : 1.8.21.
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-daemon-embeddable. **Version** : 2.0.21.
* **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
* **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-script-runtime. **Version** : 1.8.22.
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-daemon-embeddable. **Version** : 2.1.20.
* **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
* **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-scripting-common. **Version** : 1.8.22.
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-klib-commonizer-embeddable. **Version** : 2.1.20.
* **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
* **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-scripting-compiler-embeddable. **Version** : 1.8.22.
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-reflect. **Version** : 2.0.21.
* **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
* **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-scripting-compiler-impl-embeddable. **Version** : 1.8.22.
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-reflect. **Version** : 2.1.20.
* **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
* **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-scripting-jvm. **Version** : 1.8.22.
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-script-runtime. **Version** : 2.0.21.
* **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
* **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib. **Version** : 1.9.24.
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-script-runtime. **Version** : 2.1.20.
* **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
* **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib-common. **Version** : 1.9.24.
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-scripting-common. **Version** : 2.1.20.
* **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
* **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib-jdk7. **Version** : 1.9.24.
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-scripting-compiler-embeddable. **Version** : 2.1.20.
* **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
* **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib-jdk8. **Version** : 1.9.24.
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-scripting-compiler-impl-embeddable. **Version** : 2.1.20.
* **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
* **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : org.jetbrains.kotlinx. **Name** : atomicfu. **Version** : 0.17.3.
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-scripting-jvm. **Version** : 2.1.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib. **Version** : 2.0.21.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib. **Version** : 2.1.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib-common. **Version** : 2.0.21.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib-common. **Version** : 2.1.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib-jdk7. **Version** : 2.0.21.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib-jdk7. **Version** : 2.1.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib-jdk8. **Version** : 2.0.21.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib-jdk8. **Version** : 2.1.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlinx. **Name** : atomicfu. **Version** : 0.23.1.
* **Project URL:** [https://github.com/Kotlin/kotlinx.atomicfu](https://github.com/Kotlin/kotlinx.atomicfu)
* **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-coroutines-bom. **Version** : 1.6.4.
+1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-coroutines-bom. **Version** : 1.10.2.
* **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines)
- * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+ * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-coroutines-core. **Version** : 1.6.4.
+1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-coroutines-core. **Version** : 1.10.2.
* **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines)
- * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+ * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-coroutines-core-jvm. **Version** : 1.10.2.
+ * **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines)
+ * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-coroutines-core-jvm. **Version** : 1.6.4.
* **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines)
* **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-coroutines-jdk8. **Version** : 1.6.4.
+1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-coroutines-jdk8. **Version** : 1.10.2.
* **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines)
- * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+ * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-coroutines-test. **Version** : 1.10.2.
+ * **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines)
+ * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-coroutines-test-jvm. **Version** : 1.10.2.
+ * **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines)
+ * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-html-jvm. **Version** : 0.8.1.
* **Project URL:** [https://github.com/Kotlin/kotlinx.html](https://github.com/Kotlin/kotlinx.html)
@@ -541,27 +629,39 @@
* **Project URL:** [https://github.com/Kotlin/kotlinx.serialization](https://github.com/Kotlin/kotlinx.serialization)
* **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : org.junit. **Name** : junit-bom. **Version** : 5.10.0.
+1. **Group** : org.jspecify. **Name** : jspecify. **Version** : 1.0.0.
+ * **Project URL:** [http://jspecify.org/](http://jspecify.org/)
+ * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.junit. **Name** : junit-bom. **Version** : 5.12.2.
+ * **Project URL:** [https://junit.org/junit5/](https://junit.org/junit5/)
+ * **License:** [Eclipse Public License v2.0](https://www.eclipse.org/legal/epl-v20.html)
+
+1. **Group** : org.junit-pioneer. **Name** : junit-pioneer. **Version** : 2.3.0.
+ * **Project URL:** [https://junit-pioneer.org/](https://junit-pioneer.org/)
+ * **License:** [Eclipse Public License v2.0](https://www.eclipse.org/legal/epl-v20.html)
+
+1. **Group** : org.junit.jupiter. **Name** : junit-jupiter-api. **Version** : 5.12.2.
* **Project URL:** [https://junit.org/junit5/](https://junit.org/junit5/)
* **License:** [Eclipse Public License v2.0](https://www.eclipse.org/legal/epl-v20.html)
-1. **Group** : org.junit.jupiter. **Name** : junit-jupiter-api. **Version** : 5.10.0.
+1. **Group** : org.junit.jupiter. **Name** : junit-jupiter-engine. **Version** : 5.12.2.
* **Project URL:** [https://junit.org/junit5/](https://junit.org/junit5/)
* **License:** [Eclipse Public License v2.0](https://www.eclipse.org/legal/epl-v20.html)
-1. **Group** : org.junit.jupiter. **Name** : junit-jupiter-engine. **Version** : 5.10.0.
+1. **Group** : org.junit.jupiter. **Name** : junit-jupiter-params. **Version** : 5.12.2.
* **Project URL:** [https://junit.org/junit5/](https://junit.org/junit5/)
* **License:** [Eclipse Public License v2.0](https://www.eclipse.org/legal/epl-v20.html)
-1. **Group** : org.junit.jupiter. **Name** : junit-jupiter-params. **Version** : 5.10.0.
+1. **Group** : org.junit.platform. **Name** : junit-platform-commons. **Version** : 1.12.2.
* **Project URL:** [https://junit.org/junit5/](https://junit.org/junit5/)
* **License:** [Eclipse Public License v2.0](https://www.eclipse.org/legal/epl-v20.html)
-1. **Group** : org.junit.platform. **Name** : junit-platform-commons. **Version** : 1.10.0.
+1. **Group** : org.junit.platform. **Name** : junit-platform-engine. **Version** : 1.12.2.
* **Project URL:** [https://junit.org/junit5/](https://junit.org/junit5/)
* **License:** [Eclipse Public License v2.0](https://www.eclipse.org/legal/epl-v20.html)
-1. **Group** : org.junit.platform. **Name** : junit-platform-engine. **Version** : 1.10.0.
+1. **Group** : org.junit.platform. **Name** : junit-platform-launcher. **Version** : 1.12.2.
* **Project URL:** [https://junit.org/junit5/](https://junit.org/junit5/)
* **License:** [Eclipse Public License v2.0](https://www.eclipse.org/legal/epl-v20.html)
@@ -584,7 +684,11 @@
* **License:** [BSD-3-Clause](https://asm.ow2.io/license.html)
* **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : org.pcollections. **Name** : pcollections. **Version** : 3.1.4.
+1. **Group** : org.pcollections. **Name** : pcollections. **Version** : 4.0.1.
+ * **Project URL:** [https://github.com/hrldcpr/pcollections](https://github.com/hrldcpr/pcollections)
+ * **License:** [The MIT License](https://opensource.org/licenses/mit-license.php)
+
+1. **Group** : org.pcollections. **Name** : pcollections. **Version** : 4.0.2.
* **Project URL:** [https://github.com/hrldcpr/pcollections](https://github.com/hrldcpr/pcollections)
* **License:** [The MIT License](https://opensource.org/licenses/mit-license.php)
@@ -593,7 +697,11 @@
* **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
* **License:** [WTFPL](http://www.wtfpl.net/)
-1. **Group** : org.snakeyaml. **Name** : snakeyaml-engine. **Version** : 2.6.
+1. **Group** : org.slf4j. **Name** : jul-to-slf4j. **Version** : 1.7.36.
+ * **Project URL:** [http://www.slf4j.org](http://www.slf4j.org)
+ * **License:** [MIT License](http://www.opensource.org/licenses/mit-license.php)
+
+1. **Group** : org.snakeyaml. **Name** : snakeyaml-engine. **Version** : 2.7.
* **Project URL:** [https://bitbucket.org/snakeyaml/snakeyaml-engine](https://bitbucket.org/snakeyaml/snakeyaml-engine)
* **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
@@ -601,34 +709,38 @@
* **Project URL:** [https://github.com/xmlresolver/xmlresolver](https://github.com/xmlresolver/xmlresolver)
* **License:** [Apache License version 2.0](https://www.apache.org/licenses/LICENSE-2.0)
+1. **Group** : org.xmlresolver. **Name** : xmlresolver. **Version** : 5.2.2.
+ * **Project URL:** [https://github.com/xmlresolver/xmlresolver](https://github.com/xmlresolver/xmlresolver)
+ * **License:** [Apache License version 2.0](https://www.apache.org/licenses/LICENSE-2.0)
+
The dependencies distributed under several licenses, are used according their commercial-use-friendly license.
-This report was generated on **Sun Feb 16 16:24:12 WET 2025** 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).
+This report was generated on **Wed May 07 19:20:12 WEST 2025** 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:prototap-gradle-plugin:0.9.1`
+# Dependencies of `io.spine.tools:prototap-gradle-plugin:0.10.0`
## Runtime
1. **Group** : com.google.code.findbugs. **Name** : jsr305. **Version** : 3.0.2.
* **Project URL:** [http://findbugs.sourceforge.net/](http://findbugs.sourceforge.net/)
* **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : com.google.code.gson. **Name** : gson. **Version** : 2.10.1.
- * **Project URL:** [https://github.com/google/gson/gson](https://github.com/google/gson/gson)
+1. **Group** : com.google.code.gson. **Name** : gson. **Version** : 2.13.0.
+ * **Project URL:** [https://github.com/google/gson](https://github.com/google/gson)
* **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : com.google.errorprone. **Name** : error_prone_annotations. **Version** : 2.23.0.
+1. **Group** : com.google.errorprone. **Name** : error_prone_annotations. **Version** : 2.36.0.
* **Project URL:** [https://errorprone.info/error_prone_annotations](https://errorprone.info/error_prone_annotations)
* **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : com.google.guava. **Name** : failureaccess. **Version** : 1.0.1.
+1. **Group** : com.google.guava. **Name** : failureaccess. **Version** : 1.0.3.
* **Project URL:** [https://github.com/google/guava/](https://github.com/google/guava/)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+ * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : com.google.guava. **Name** : guava. **Version** : 32.1.3-jre.
+1. **Group** : com.google.guava. **Name** : guava. **Version** : 33.4.8-jre.
* **Project URL:** [https://github.com/google/guava](https://github.com/google/guava)
* **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
@@ -639,15 +751,16 @@ This report was generated on **Sun Feb 16 16:24:12 WET 2025** using [Gradle-Lice
* **Project URL:** [https://github.com/google/j2objc/](https://github.com/google/j2objc/)
* **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : com.google.protobuf. **Name** : protobuf-java. **Version** : 3.25.1.
+1. **Group** : com.google.protobuf. **Name** : protobuf-java. **Version** : 3.25.7.
* **Project URL:** [https://developers.google.com/protocol-buffers/](https://developers.google.com/protocol-buffers/)
* **License:** [BSD-3-Clause](https://opensource.org/licenses/BSD-3-Clause)
-1. **Group** : com.google.protobuf. **Name** : protobuf-java-util. **Version** : 3.25.1.
+1. **Group** : com.google.protobuf. **Name** : protobuf-java-util. **Version** : 3.25.7.
* **Project URL:** [https://developers.google.com/protocol-buffers/](https://developers.google.com/protocol-buffers/)
* **License:** [BSD-3-Clause](https://opensource.org/licenses/BSD-3-Clause)
-1. **Group** : com.google.protobuf. **Name** : protobuf-kotlin. **Version** : 3.25.1.
+1. **Group** : com.google.protobuf. **Name** : protobuf-kotlin. **Version** : 3.25.7.
+ * **Project URL:** [https://developers.google.com/protocol-buffers/](https://developers.google.com/protocol-buffers/)
* **License:** [BSD-3-Clause](https://opensource.org/licenses/BSD-3-Clause)
1. **Group** : com.squareup. **Name** : javapoet. **Version** : 1.13.0.
@@ -658,88 +771,80 @@ This report was generated on **Sun Feb 16 16:24:12 WET 2025** using [Gradle-Lice
* **Project URL:** [http://jcp.org/en/jsr/detail?id=250](http://jcp.org/en/jsr/detail?id=250)
* **License:** [CDDL + GPLv2 with classpath exception](https://github.com/javaee/javax.annotation/blob/master/LICENSE)
-1. **Group** : org.checkerframework. **Name** : checker-qual. **Version** : 3.40.0.
- * **Project URL:** [https://checkerframework.org/](https://checkerframework.org/)
- * **License:** [The MIT License](http://opensource.org/licenses/MIT)
-
-1. **Group** : org.jboss.forge.roaster. **Name** : roaster-api. **Version** : 2.28.0.Final.
+1. **Group** : org.jboss.forge.roaster. **Name** : roaster-api. **Version** : 2.29.0.Final.
* **License:** [Eclipse Public License version 1.0](http://www.eclipse.org/legal/epl-v10.html)
* **License:** [Public Domain](http://repository.jboss.org/licenses/cc0-1.0.txt)
-1. **Group** : org.jboss.forge.roaster. **Name** : roaster-jdt. **Version** : 2.28.0.Final.
+1. **Group** : org.jboss.forge.roaster. **Name** : roaster-jdt. **Version** : 2.29.0.Final.
* **License:** [Eclipse Public License version 1.0](http://www.eclipse.org/legal/epl-v10.html)
* **License:** [Public Domain](http://repository.jboss.org/licenses/cc0-1.0.txt)
-1. **Group** : org.jetbrains. **Name** : annotations. **Version** : 24.0.1.
+1. **Group** : org.jetbrains. **Name** : annotations. **Version** : 26.0.2.
* **Project URL:** [https://github.com/JetBrains/java-annotations](https://github.com/JetBrains/java-annotations)
* **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-gradle-plugin-annotations. **Version** : 1.9.24.
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-bom. **Version** : 2.1.20.
* **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
- * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-gradle-plugin-api. **Version** : 1.9.24.
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-build-tools-api. **Version** : 2.1.20.
* **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
* **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-gradle-plugins-bom. **Version** : 1.9.24.
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-gradle-plugin-annotations. **Version** : 2.1.20.
* **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
* **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-native-utils. **Version** : 1.9.24.
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-gradle-plugin-api. **Version** : 2.1.20.
* **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
* **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-project-model. **Version** : 1.9.24.
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-gradle-plugins-bom. **Version** : 2.1.20.
* **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
* **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-reflect. **Version** : 1.9.24.
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-native-utils. **Version** : 2.1.20.
* **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
* **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib. **Version** : 1.9.24.
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-reflect. **Version** : 2.1.20.
* **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
* **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib-jdk7. **Version** : 1.9.24.
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib. **Version** : 2.1.20.
* **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
* **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib-jdk8. **Version** : 1.9.24.
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib-jdk7. **Version** : 2.1.20.
* **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
* **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-tooling-core. **Version** : 1.9.24.
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib-jdk8. **Version** : 2.1.20.
* **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
* **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-util-io. **Version** : 1.9.24.
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-tooling-core. **Version** : 2.1.20.
* **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
* **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-util-klib. **Version** : 1.9.24.
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-util-io. **Version** : 2.1.20.
* **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
* **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-coroutines-bom. **Version** : 1.10.2.
+ * **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines)
+ * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jspecify. **Name** : jspecify. **Version** : 1.0.0.
+ * **Project URL:** [http://jspecify.org/](http://jspecify.org/)
+ * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
1. **Group** : org.ow2.asm. **Name** : asm. **Version** : 9.6.
* **Project URL:** [http://asm.ow2.io/](http://asm.ow2.io/)
* **License:** [BSD-3-Clause](https://asm.ow2.io/license.html)
* **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
## Compile, tests, and tooling
-1. **Group** : aopalliance. **Name** : aopalliance. **Version** : 1.0.
- * **Project URL:** [http://aopalliance.sourceforge.net](http://aopalliance.sourceforge.net)
- * **License:** Public Domain
-
-1. **Group** : com.beust. **Name** : jcommander. **Version** : 1.48.
- * **Project URL:** [http://beust.com/jcommander](http://beust.com/jcommander)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.beust. **Name** : jcommander. **Version** : 1.82.
- * **Project URL:** [https://jcommander.org](https://jcommander.org)
- * **License:** [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
1. **Group** : com.github.ben-manes.caffeine. **Name** : caffeine. **Version** : 3.0.5.
* **Project URL:** [https://github.com/ben-manes/caffeine](https://github.com/ben-manes/caffeine)
* **License:** [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
@@ -748,6 +853,10 @@ This report was generated on **Sun Feb 16 16:24:12 WET 2025** using [Gradle-Lice
* **Project URL:** [https://www.github.com/KevinStern/software-and-algorithms](https://www.github.com/KevinStern/software-and-algorithms)
* **License:** [MIT License](http://www.opensource.org/licenses/mit-license.php)
+1. **Group** : com.github.oowekyala.ooxml. **Name** : nice-xml-messages. **Version** : 3.1.
+ * **Project URL:** [https://github.com/oowekyala/nice-xml-messages](https://github.com/oowekyala/nice-xml-messages)
+ * **License:** [MIT License](https://github.com/oowekyala/nice-xml-messages/tree/master/LICENSE)
+
1. **Group** : com.google.auto. **Name** : auto-common. **Version** : 1.2.2.
* **Project URL:** [https://github.com/google/auto/tree/main/common](https://github.com/google/auto/tree/main/common)
* **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
@@ -764,27 +873,27 @@ This report was generated on **Sun Feb 16 16:24:12 WET 2025** using [Gradle-Lice
* **Project URL:** [http://findbugs.sourceforge.net/](http://findbugs.sourceforge.net/)
* **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : com.google.code.gson. **Name** : gson. **Version** : 2.10.1.
- * **Project URL:** [https://github.com/google/gson/gson](https://github.com/google/gson/gson)
+1. **Group** : com.google.code.gson. **Name** : gson. **Version** : 2.13.0.
+ * **Project URL:** [https://github.com/google/gson](https://github.com/google/gson)
* **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : com.google.errorprone. **Name** : error_prone_annotation. **Version** : 2.23.0.
+1. **Group** : com.google.errorprone. **Name** : error_prone_annotation. **Version** : 2.36.0.
* **Project URL:** [https://errorprone.info/error_prone_annotation](https://errorprone.info/error_prone_annotation)
* **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : com.google.errorprone. **Name** : error_prone_annotations. **Version** : 2.23.0.
+1. **Group** : com.google.errorprone. **Name** : error_prone_annotations. **Version** : 2.36.0.
* **Project URL:** [https://errorprone.info/error_prone_annotations](https://errorprone.info/error_prone_annotations)
* **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : com.google.errorprone. **Name** : error_prone_check_api. **Version** : 2.23.0.
+1. **Group** : com.google.errorprone. **Name** : error_prone_check_api. **Version** : 2.36.0.
* **Project URL:** [https://errorprone.info/error_prone_check_api](https://errorprone.info/error_prone_check_api)
* **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : com.google.errorprone. **Name** : error_prone_core. **Version** : 2.23.0.
+1. **Group** : com.google.errorprone. **Name** : error_prone_core. **Version** : 2.36.0.
* **Project URL:** [https://errorprone.info/error_prone_core](https://errorprone.info/error_prone_core)
* **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : com.google.errorprone. **Name** : error_prone_type_annotations. **Version** : 2.23.0.
+1. **Group** : com.google.errorprone. **Name** : error_prone_type_annotations. **Version** : 2.36.0.
* **Project URL:** [https://errorprone.info/error_prone_type_annotations](https://errorprone.info/error_prone_type_annotations)
* **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
@@ -800,57 +909,57 @@ This report was generated on **Sun Feb 16 16:24:12 WET 2025** using [Gradle-Lice
* **Project URL:** [https://github.com/google/flogger](https://github.com/google/flogger)
* **License:** [Apache 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+1. **Group** : com.google.googlejavaformat. **Name** : google-java-format. **Version** : 1.19.1.
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
1. **Group** : com.google.gradle. **Name** : osdetector-gradle-plugin. **Version** : 1.7.3.
* **Project URL:** [https://github.com/google/osdetector-gradle-plugin](https://github.com/google/osdetector-gradle-plugin)
* **License:** [Apache License 2.0](http://opensource.org/licenses/Apache-2.0)
-1. **Group** : com.google.guava. **Name** : failureaccess. **Version** : 1.0.1.
+1. **Group** : com.google.guava. **Name** : failureaccess. **Version** : 1.0.3.
* **Project URL:** [https://github.com/google/guava/](https://github.com/google/guava/)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+ * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : com.google.guava. **Name** : guava. **Version** : 32.1.3-jre.
+1. **Group** : com.google.guava. **Name** : guava. **Version** : 33.4.8-jre.
* **Project URL:** [https://github.com/google/guava](https://github.com/google/guava)
* **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : com.google.guava. **Name** : guava-testlib. **Version** : 32.1.3-jre.
+1. **Group** : com.google.guava. **Name** : guava-testlib. **Version** : 33.4.8-jre.
* **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
1. **Group** : com.google.guava. **Name** : listenablefuture. **Version** : 9999.0-empty-to-avoid-conflict-with-guava.
* **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : com.google.inject. **Name** : guice. **Version** : 5.1.0.
- * **Project URL:** [https://github.com/google/guice](https://github.com/google/guice)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
1. **Group** : com.google.j2objc. **Name** : j2objc-annotations. **Version** : 2.8.
* **Project URL:** [https://github.com/google/j2objc/](https://github.com/google/j2objc/)
* **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : com.google.protobuf. **Name** : protobuf-gradle-plugin. **Version** : 0.9.4.
+1. **Group** : com.google.protobuf. **Name** : protobuf-gradle-plugin. **Version** : 0.9.5.
* **Project URL:** [https://github.com/google/protobuf-gradle-plugin](https://github.com/google/protobuf-gradle-plugin)
* **License:** [BSD 3-Clause](http://opensource.org/licenses/BSD-3-Clause)
-1. **Group** : com.google.protobuf. **Name** : protobuf-java. **Version** : 3.25.1.
+1. **Group** : com.google.protobuf. **Name** : protobuf-java. **Version** : 3.25.7.
* **Project URL:** [https://developers.google.com/protocol-buffers/](https://developers.google.com/protocol-buffers/)
* **License:** [BSD-3-Clause](https://opensource.org/licenses/BSD-3-Clause)
-1. **Group** : com.google.protobuf. **Name** : protobuf-java-util. **Version** : 3.25.1.
+1. **Group** : com.google.protobuf. **Name** : protobuf-java-util. **Version** : 3.25.7.
* **Project URL:** [https://developers.google.com/protocol-buffers/](https://developers.google.com/protocol-buffers/)
* **License:** [BSD-3-Clause](https://opensource.org/licenses/BSD-3-Clause)
-1. **Group** : com.google.protobuf. **Name** : protobuf-kotlin. **Version** : 3.25.1.
+1. **Group** : com.google.protobuf. **Name** : protobuf-kotlin. **Version** : 3.25.7.
+ * **Project URL:** [https://developers.google.com/protocol-buffers/](https://developers.google.com/protocol-buffers/)
* **License:** [BSD-3-Clause](https://opensource.org/licenses/BSD-3-Clause)
-1. **Group** : com.google.truth. **Name** : truth. **Version** : 1.1.5.
+1. **Group** : com.google.truth. **Name** : truth. **Version** : 1.4.4.
* **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : com.google.truth.extensions. **Name** : truth-java8-extension. **Version** : 1.1.5.
+1. **Group** : com.google.truth.extensions. **Name** : truth-java8-extension. **Version** : 1.4.4.
* **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : com.google.truth.extensions. **Name** : truth-liteproto-extension. **Version** : 1.1.5.
+1. **Group** : com.google.truth.extensions. **Name** : truth-liteproto-extension. **Version** : 1.4.4.
* **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : com.google.truth.extensions. **Name** : truth-proto-extension. **Version** : 1.1.5.
+1. **Group** : com.google.truth.extensions. **Name** : truth-proto-extension. **Version** : 1.4.4.
* **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
1. **Group** : com.puppycrawl.tools. **Name** : checkstyle. **Version** : 10.12.1.
@@ -873,6 +982,14 @@ This report was generated on **Sun Feb 16 16:24:12 WET 2025** using [Gradle-Lice
* **Project URL:** [http://commons.apache.org/collections/](http://commons.apache.org/collections/)
* **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+1. **Group** : dev.drewhamilton.poko. **Name** : poko-annotations. **Version** : 0.17.1.
+ * **Project URL:** [https://github.com/drewhamilton/Poko](https://github.com/drewhamilton/Poko)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : dev.drewhamilton.poko. **Name** : poko-annotations-jvm. **Version** : 0.17.1.
+ * **Project URL:** [https://github.com/drewhamilton/Poko](https://github.com/drewhamilton/Poko)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
1. **Group** : info.picocli. **Name** : picocli. **Version** : 4.7.4.
* **Project URL:** [https://picocli.info](https://picocli.info)
* **License:** [The Apache Software License, version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
@@ -881,142 +998,158 @@ This report was generated on **Sun Feb 16 16:24:12 WET 2025** using [Gradle-Lice
* **Project URL:** [https://github.com/davidburstrom/contester](https://github.com/davidburstrom/contester)
* **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : io.github.detekt.sarif4k. **Name** : sarif4k. **Version** : 0.4.0.
+1. **Group** : io.github.detekt.sarif4k. **Name** : sarif4k. **Version** : 0.6.0.
* **Project URL:** [https://detekt.github.io/detekt](https://detekt.github.io/detekt)
* **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : io.github.detekt.sarif4k. **Name** : sarif4k-jvm. **Version** : 0.4.0.
+1. **Group** : io.github.detekt.sarif4k. **Name** : sarif4k-jvm. **Version** : 0.6.0.
* **Project URL:** [https://detekt.github.io/detekt](https://detekt.github.io/detekt)
* **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : io.github.eisop. **Name** : dataflow-errorprone. **Version** : 3.34.0-eisop1.
+1. **Group** : io.github.eisop. **Name** : dataflow-errorprone. **Version** : 3.41.0-eisop1.
* **Project URL:** [https://eisop.github.io/](https://eisop.github.io/)
* **License:** [GNU General Public License, version 2 (GPL2), with the classpath exception](http://www.gnu.org/software/classpath/license.html)
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.gitlab.arturbosch.detekt. **Name** : detekt-api. **Version** : 1.23.0.
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-api. **Version** : 1.23.8.
* **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.gitlab.arturbosch.detekt. **Name** : detekt-cli. **Version** : 1.23.0.
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-cli. **Version** : 1.23.8.
* **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.gitlab.arturbosch.detekt. **Name** : detekt-core. **Version** : 1.23.0.
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-core. **Version** : 1.23.8.
* **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.gitlab.arturbosch.detekt. **Name** : detekt-metrics. **Version** : 1.23.0.
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-metrics. **Version** : 1.23.8.
* **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.gitlab.arturbosch.detekt. **Name** : detekt-parser. **Version** : 1.23.0.
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-parser. **Version** : 1.23.8.
* **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.gitlab.arturbosch.detekt. **Name** : detekt-psi-utils. **Version** : 1.23.0.
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-psi-utils. **Version** : 1.23.8.
* **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.gitlab.arturbosch.detekt. **Name** : detekt-report-html. **Version** : 1.23.0.
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-report-html. **Version** : 1.23.8.
* **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.gitlab.arturbosch.detekt. **Name** : detekt-report-md. **Version** : 1.23.0.
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-report-md. **Version** : 1.23.8.
* **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.gitlab.arturbosch.detekt. **Name** : detekt-report-sarif. **Version** : 1.23.0.
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-report-sarif. **Version** : 1.23.8.
* **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.gitlab.arturbosch.detekt. **Name** : detekt-report-txt. **Version** : 1.23.0.
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-report-txt. **Version** : 1.23.8.
* **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.gitlab.arturbosch.detekt. **Name** : detekt-report-xml. **Version** : 1.23.0.
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-report-xml. **Version** : 1.23.8.
* **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.gitlab.arturbosch.detekt. **Name** : detekt-rules. **Version** : 1.23.0.
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-rules. **Version** : 1.23.8.
* **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.gitlab.arturbosch.detekt. **Name** : detekt-rules-complexity. **Version** : 1.23.0.
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-rules-complexity. **Version** : 1.23.8.
* **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.gitlab.arturbosch.detekt. **Name** : detekt-rules-coroutines. **Version** : 1.23.0.
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-rules-coroutines. **Version** : 1.23.8.
* **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.gitlab.arturbosch.detekt. **Name** : detekt-rules-documentation. **Version** : 1.23.0.
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-rules-documentation. **Version** : 1.23.8.
* **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.gitlab.arturbosch.detekt. **Name** : detekt-rules-empty. **Version** : 1.23.0.
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-rules-empty. **Version** : 1.23.8.
* **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.gitlab.arturbosch.detekt. **Name** : detekt-rules-errorprone. **Version** : 1.23.0.
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-rules-errorprone. **Version** : 1.23.8.
* **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.gitlab.arturbosch.detekt. **Name** : detekt-rules-exceptions. **Version** : 1.23.0.
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-rules-exceptions. **Version** : 1.23.8.
* **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.gitlab.arturbosch.detekt. **Name** : detekt-rules-naming. **Version** : 1.23.0.
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-rules-naming. **Version** : 1.23.8.
* **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.gitlab.arturbosch.detekt. **Name** : detekt-rules-performance. **Version** : 1.23.0.
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-rules-performance. **Version** : 1.23.8.
* **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.gitlab.arturbosch.detekt. **Name** : detekt-rules-style. **Version** : 1.23.0.
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-rules-style. **Version** : 1.23.8.
* **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.gitlab.arturbosch.detekt. **Name** : detekt-tooling. **Version** : 1.23.0.
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-tooling. **Version** : 1.23.8.
* **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.gitlab.arturbosch.detekt. **Name** : detekt-utils. **Version** : 1.23.0.
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-utils. **Version** : 1.23.8.
* **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-api. **Version** : 5.8.0.
+1. **Group** : io.kotest. **Name** : kotest-assertions-api. **Version** : 5.9.1.
+ * **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-api-jvm. **Version** : 5.9.1.
+ * **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. **Version** : 5.9.1.
+ * **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** : 5.9.1.
* **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-api-jvm. **Version** : 5.8.0.
+1. **Group** : io.kotest. **Name** : kotest-assertions-shared. **Version** : 5.9.1.
* **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. **Version** : 5.8.0.
+1. **Group** : io.kotest. **Name** : kotest-assertions-shared-jvm. **Version** : 5.9.1.
* **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** : 5.8.0.
+1. **Group** : io.kotest. **Name** : kotest-common. **Version** : 5.9.1.
* **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** : 5.8.0.
+1. **Group** : io.kotest. **Name** : kotest-common-jvm. **Version** : 5.9.1.
* **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** : 5.8.0.
+1. **Group** : io.kotest. **Name** : kotest-framework-api. **Version** : 5.9.1.
* **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** : 5.8.0.
+1. **Group** : io.kotest. **Name** : kotest-framework-api-jvm. **Version** : 5.9.1.
* **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** : 5.8.0.
+1. **Group** : io.kotest. **Name** : kotest-framework-datatest. **Version** : 5.9.1.
+ * **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-framework-datatest-jvm. **Version** : 5.9.1.
* **Project URL:** [https://github.com/kotest/kotest](https://github.com/kotest/kotest)
* **License:** [Apache-2.0](https://opensource.org/licenses/Apache-2.0)
@@ -1028,7 +1161,7 @@ This report was generated on **Sun Feb 16 16:24:12 WET 2025** using [Gradle-Lice
* **Project URL:** [http://code.google.com/p/atinject/](http://code.google.com/p/atinject/)
* **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : junit. **Name** : junit. **Version** : 4.13.1.
+1. **Group** : junit. **Name** : junit. **Version** : 4.13.2.
* **Project URL:** [http://junit.org](http://junit.org)
* **License:** [Eclipse Public License 1.0](http://www.eclipse.org/legal/epl-v10.html)
@@ -1036,36 +1169,34 @@ This report was generated on **Sun Feb 16 16:24:12 WET 2025** using [Gradle-Lice
* **Project URL:** [https://github.com/trustin/os-maven-plugin/](https://github.com/trustin/os-maven-plugin/)
* **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0)
-1. **Group** : net.java.dev.jna. **Name** : jna. **Version** : 5.6.0.
- * **Project URL:** [https://github.com/java-native-access/jna](https://github.com/java-native-access/jna)
- * **License:** [Apache License v2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
- * **License:** [LGPL, version 2.1](http://www.gnu.org/licenses/licenses.html)
-
1. **Group** : net.sf.saxon. **Name** : Saxon-HE. **Version** : 12.2.
* **Project URL:** [http://www.saxonica.com/](http://www.saxonica.com/)
* **License:** [Mozilla Public License Version 2.0](http://www.mozilla.org/MPL/2.0/)
-1. **Group** : net.sourceforge.pmd. **Name** : pmd-core. **Version** : 6.55.0.
+1. **Group** : net.sf.saxon. **Name** : Saxon-HE. **Version** : 12.5.
+ * **Project URL:** [http://www.saxonica.com/](http://www.saxonica.com/)
+ * **License:** [Mozilla Public License Version 2.0](http://www.mozilla.org/MPL/2.0/)
+
+1. **Group** : net.sourceforge.pmd. **Name** : pmd-ant. **Version** : 7.12.0.
* **License:** [BSD-style](http://pmd.sourceforge.net/license.html)
-1. **Group** : net.sourceforge.pmd. **Name** : pmd-java. **Version** : 6.55.0.
+1. **Group** : net.sourceforge.pmd. **Name** : pmd-core. **Version** : 7.12.0.
* **License:** [BSD-style](http://pmd.sourceforge.net/license.html)
-1. **Group** : net.sourceforge.saxon. **Name** : saxon. **Version** : 9.1.0.8.
- * **Project URL:** [http://saxon.sourceforge.net/](http://saxon.sourceforge.net/)
- * **License:** [Mozilla Public License Version 1.0](http://www.mozilla.org/MPL/MPL-1.0.txt)
+1. **Group** : net.sourceforge.pmd. **Name** : pmd-java. **Version** : 7.12.0.
+ * **License:** [BSD-style](http://pmd.sourceforge.net/license.html)
1. **Group** : org.antlr. **Name** : antlr4-runtime. **Version** : 4.11.1.
* **Project URL:** [https://www.antlr.org/](https://www.antlr.org/)
* **License:** [BSD-3-Clause](https://www.antlr.org/license.html)
-1. **Group** : org.antlr. **Name** : antlr4-runtime. **Version** : 4.7.2.
+1. **Group** : org.antlr. **Name** : antlr4-runtime. **Version** : 4.9.3.
* **Project URL:** [http://www.antlr.org](http://www.antlr.org)
* **License:** [The BSD License](http://www.antlr.org/license.html)
-1. **Group** : org.apache.commons. **Name** : commons-lang3. **Version** : 3.8.1.
- * **Project URL:** [http://commons.apache.org/proper/commons-lang/](http://commons.apache.org/proper/commons-lang/)
- * **License:** [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+1. **Group** : org.apache.commons. **Name** : commons-lang3. **Version** : 3.17.0.
+ * **Project URL:** [https://commons.apache.org/proper/commons-lang/](https://commons.apache.org/proper/commons-lang/)
+ * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
1. **Group** : org.apache.httpcomponents.client5. **Name** : httpclient5. **Version** : 5.1.3.
* **License:** [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
@@ -1089,13 +1220,13 @@ This report was generated on **Sun Feb 16 16:24:12 WET 2025** using [Gradle-Lice
* **Project URL:** [https://checkerframework.org/](https://checkerframework.org/)
* **License:** [The MIT License](http://opensource.org/licenses/MIT)
-1. **Group** : org.hamcrest. **Name** : hamcrest. **Version** : 2.2.
+1. **Group** : org.hamcrest. **Name** : hamcrest. **Version** : 3.0.
* **Project URL:** [http://hamcrest.org/JavaHamcrest/](http://hamcrest.org/JavaHamcrest/)
- * **License:** [BSD License 3](http://opensource.org/licenses/BSD-3-Clause)
+ * **License:** [BSD-3-Clause](https://raw.githubusercontent.com/hamcrest/JavaHamcrest/master/LICENSE)
-1. **Group** : org.hamcrest. **Name** : hamcrest-core. **Version** : 2.2.
+1. **Group** : org.hamcrest. **Name** : hamcrest-core. **Version** : 3.0.
* **Project URL:** [http://hamcrest.org/JavaHamcrest/](http://hamcrest.org/JavaHamcrest/)
- * **License:** [BSD License 3](http://opensource.org/licenses/BSD-3-Clause)
+ * **License:** [BSD-3-Clause](https://raw.githubusercontent.com/hamcrest/JavaHamcrest/master/LICENSE)
1. **Group** : org.jacoco. **Name** : org.jacoco.agent. **Version** : 0.8.12.
* **License:** [EPL-2.0](https://www.eclipse.org/legal/epl-2.0/)
@@ -1115,15 +1246,19 @@ This report was generated on **Sun Feb 16 16:24:12 WET 2025** using [Gradle-Lice
* **License:** [LGPL 2.1](http://www.gnu.org/licenses/lgpl-2.1.html)
* **License:** [MPL 1.1](http://www.mozilla.org/MPL/MPL-1.1.html)
-1. **Group** : org.jboss.forge.roaster. **Name** : roaster-api. **Version** : 2.28.0.Final.
+1. **Group** : org.jboss.forge.roaster. **Name** : roaster-api. **Version** : 2.29.0.Final.
* **License:** [Eclipse Public License version 1.0](http://www.eclipse.org/legal/epl-v10.html)
* **License:** [Public Domain](http://repository.jboss.org/licenses/cc0-1.0.txt)
-1. **Group** : org.jboss.forge.roaster. **Name** : roaster-jdt. **Version** : 2.28.0.Final.
+1. **Group** : org.jboss.forge.roaster. **Name** : roaster-jdt. **Version** : 2.29.0.Final.
* **License:** [Eclipse Public License version 1.0](http://www.eclipse.org/legal/epl-v10.html)
* **License:** [Public Domain](http://repository.jboss.org/licenses/cc0-1.0.txt)
-1. **Group** : org.jetbrains. **Name** : annotations. **Version** : 24.0.1.
+1. **Group** : org.jcommander. **Name** : jcommander. **Version** : 1.85.
+ * **Project URL:** [https://jcommander.org](https://jcommander.org)
+ * **License:** [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains. **Name** : annotations. **Version** : 26.0.2.
* **Project URL:** [https://github.com/JetBrains/java-annotations](https://github.com/JetBrains/java-annotations)
* **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
@@ -1131,181 +1266,201 @@ This report was generated on **Sun Feb 16 16:24:12 WET 2025** using [Gradle-Lice
* **Project URL:** [https://github.com/JetBrains/intellij-deps-trove4j](https://github.com/JetBrains/intellij-deps-trove4j)
* **License:** [GNU LESSER GENERAL PUBLIC LICENSE 2.1](https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html)
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-android-extensions. **Version** : 1.9.24.
+1. **Group** : org.jetbrains.kotlin. **Name** : fus-statistics-gradle-plugin. **Version** : 2.1.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-bom. **Version** : 2.1.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-build-statistics. **Version** : 2.1.20.
* **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
* **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-build-tools-api. **Version** : 1.9.24.
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-build-tools-api. **Version** : 2.1.20.
* **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
* **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-compiler-embeddable. **Version** : 1.8.21.
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-build-tools-impl. **Version** : 2.1.20.
* **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
* **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-compiler-embeddable. **Version** : 1.8.22.
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-compiler-embeddable. **Version** : 2.0.21.
* **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
* **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-compiler-embeddable. **Version** : 1.9.24.
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-compiler-embeddable. **Version** : 2.1.20.
* **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
* **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-compiler-runner. **Version** : 1.9.24.
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-compiler-runner. **Version** : 2.1.20.
* **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
* **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-daemon-client. **Version** : 1.9.24.
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-daemon-client. **Version** : 2.1.20.
* **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
* **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-daemon-embeddable. **Version** : 1.8.21.
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-daemon-embeddable. **Version** : 2.0.21.
* **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
* **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-daemon-embeddable. **Version** : 1.8.22.
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-daemon-embeddable. **Version** : 2.1.20.
* **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
* **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-daemon-embeddable. **Version** : 1.9.24.
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-gradle-plugin. **Version** : 2.1.20.
* **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
* **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-gradle-plugin. **Version** : 1.9.24.
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-gradle-plugin-annotations. **Version** : 2.1.20.
* **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
* **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-gradle-plugin-annotations. **Version** : 1.9.24.
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-gradle-plugin-api. **Version** : 2.1.20.
* **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
* **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-gradle-plugin-api. **Version** : 1.9.24.
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-gradle-plugin-idea. **Version** : 2.1.20.
* **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
* **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-gradle-plugin-idea. **Version** : 1.9.24.
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-gradle-plugin-idea-proto. **Version** : 2.1.20.
* **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
* **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-gradle-plugin-idea-proto. **Version** : 1.9.24.
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-gradle-plugin-model. **Version** : 2.1.20.
* **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
* **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-gradle-plugin-model. **Version** : 1.9.24.
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-gradle-plugins-bom. **Version** : 2.1.20.
* **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
* **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-gradle-plugins-bom. **Version** : 1.9.24.
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-klib-commonizer-api. **Version** : 2.1.20.
* **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
* **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-klib-commonizer-api. **Version** : 1.9.24.
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-klib-commonizer-embeddable. **Version** : 2.1.20.
* **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
* **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-klib-commonizer-embeddable. **Version** : 1.8.22.
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-native-utils. **Version** : 2.1.20.
* **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
* **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-native-utils. **Version** : 1.9.24.
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-reflect. **Version** : 2.0.21.
* **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
* **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-project-model. **Version** : 1.9.24.
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-reflect. **Version** : 2.1.20.
* **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
* **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-reflect. **Version** : 1.9.24.
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-script-runtime. **Version** : 2.0.21.
* **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
* **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-script-runtime. **Version** : 1.8.21.
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-script-runtime. **Version** : 2.1.20.
* **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
* **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-script-runtime. **Version** : 1.8.22.
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-scripting-common. **Version** : 2.1.20.
* **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
* **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-scripting-common. **Version** : 1.8.22.
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-scripting-compiler-embeddable. **Version** : 2.1.20.
* **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
* **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-scripting-common. **Version** : 1.9.24.
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-scripting-compiler-impl-embeddable. **Version** : 2.1.20.
* **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
* **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-scripting-compiler-embeddable. **Version** : 1.8.22.
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-scripting-jvm. **Version** : 2.1.20.
* **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
* **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-scripting-compiler-embeddable. **Version** : 1.9.24.
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib. **Version** : 2.0.21.
* **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
* **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-scripting-compiler-impl-embeddable. **Version** : 1.8.22.
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib. **Version** : 2.1.20.
* **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
* **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-scripting-compiler-impl-embeddable. **Version** : 1.9.24.
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib-common. **Version** : 2.0.21.
* **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
* **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-scripting-jvm. **Version** : 1.8.22.
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib-common. **Version** : 2.1.20.
* **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
* **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-scripting-jvm. **Version** : 1.9.24.
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib-jdk7. **Version** : 2.0.21.
* **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
* **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib. **Version** : 1.9.24.
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib-jdk7. **Version** : 2.1.20.
* **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
* **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib-common. **Version** : 1.9.24.
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib-jdk8. **Version** : 2.0.21.
* **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
* **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib-jdk7. **Version** : 1.9.24.
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib-jdk8. **Version** : 2.1.20.
* **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
* **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib-jdk8. **Version** : 1.9.24.
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-tooling-core. **Version** : 2.1.20.
* **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
* **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-tooling-core. **Version** : 1.9.24.
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-util-io. **Version** : 2.1.20.
* **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
* **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-util-io. **Version** : 1.9.24.
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-util-klib. **Version** : 2.1.20.
* **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
* **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-util-klib. **Version** : 1.9.24.
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-util-klib-metadata. **Version** : 2.1.20.
* **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
* **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : org.jetbrains.kotlinx. **Name** : atomicfu. **Version** : 0.17.3.
+1. **Group** : org.jetbrains.kotlinx. **Name** : atomicfu. **Version** : 0.23.1.
* **Project URL:** [https://github.com/Kotlin/kotlinx.atomicfu](https://github.com/Kotlin/kotlinx.atomicfu)
* **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-coroutines-bom. **Version** : 1.6.4.
+1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-coroutines-bom. **Version** : 1.10.2.
* **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines)
- * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+ * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-coroutines-core. **Version** : 1.6.4.
+1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-coroutines-core. **Version** : 1.10.2.
* **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines)
- * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+ * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-coroutines-core-jvm. **Version** : 1.10.2.
+ * **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines)
+ * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-coroutines-core-jvm. **Version** : 1.6.4.
* **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines)
* **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-coroutines-jdk8. **Version** : 1.6.4.
+1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-coroutines-jdk8. **Version** : 1.10.2.
* **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines)
- * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+ * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-coroutines-test. **Version** : 1.10.2.
+ * **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines)
+ * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-coroutines-test-jvm. **Version** : 1.10.2.
+ * **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines)
+ * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-html-jvm. **Version** : 0.8.1.
* **Project URL:** [https://github.com/Kotlin/kotlinx.html](https://github.com/Kotlin/kotlinx.html)
@@ -1327,35 +1482,43 @@ This report was generated on **Sun Feb 16 16:24:12 WET 2025** using [Gradle-Lice
* **Project URL:** [https://github.com/Kotlin/kotlinx.serialization](https://github.com/Kotlin/kotlinx.serialization)
* **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : org.junit. **Name** : junit-bom. **Version** : 5.10.0.
+1. **Group** : org.jspecify. **Name** : jspecify. **Version** : 1.0.0.
+ * **Project URL:** [http://jspecify.org/](http://jspecify.org/)
+ * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.junit. **Name** : junit-bom. **Version** : 5.12.2.
* **Project URL:** [https://junit.org/junit5/](https://junit.org/junit5/)
* **License:** [Eclipse Public License v2.0](https://www.eclipse.org/legal/epl-v20.html)
-1. **Group** : org.junit.jupiter. **Name** : junit-jupiter. **Version** : 5.10.0.
+1. **Group** : org.junit-pioneer. **Name** : junit-pioneer. **Version** : 2.3.0.
+ * **Project URL:** [https://junit-pioneer.org/](https://junit-pioneer.org/)
+ * **License:** [Eclipse Public License v2.0](https://www.eclipse.org/legal/epl-v20.html)
+
+1. **Group** : org.junit.jupiter. **Name** : junit-jupiter. **Version** : 5.12.2.
* **Project URL:** [https://junit.org/junit5/](https://junit.org/junit5/)
* **License:** [Eclipse Public License v2.0](https://www.eclipse.org/legal/epl-v20.html)
-1. **Group** : org.junit.jupiter. **Name** : junit-jupiter-api. **Version** : 5.10.0.
+1. **Group** : org.junit.jupiter. **Name** : junit-jupiter-api. **Version** : 5.12.2.
* **Project URL:** [https://junit.org/junit5/](https://junit.org/junit5/)
* **License:** [Eclipse Public License v2.0](https://www.eclipse.org/legal/epl-v20.html)
-1. **Group** : org.junit.jupiter. **Name** : junit-jupiter-engine. **Version** : 5.10.0.
+1. **Group** : org.junit.jupiter. **Name** : junit-jupiter-engine. **Version** : 5.12.2.
* **Project URL:** [https://junit.org/junit5/](https://junit.org/junit5/)
* **License:** [Eclipse Public License v2.0](https://www.eclipse.org/legal/epl-v20.html)
-1. **Group** : org.junit.jupiter. **Name** : junit-jupiter-params. **Version** : 5.10.0.
+1. **Group** : org.junit.jupiter. **Name** : junit-jupiter-params. **Version** : 5.12.2.
* **Project URL:** [https://junit.org/junit5/](https://junit.org/junit5/)
* **License:** [Eclipse Public License v2.0](https://www.eclipse.org/legal/epl-v20.html)
-1. **Group** : org.junit.platform. **Name** : junit-platform-commons. **Version** : 1.10.0.
+1. **Group** : org.junit.platform. **Name** : junit-platform-commons. **Version** : 1.12.2.
* **Project URL:** [https://junit.org/junit5/](https://junit.org/junit5/)
* **License:** [Eclipse Public License v2.0](https://www.eclipse.org/legal/epl-v20.html)
-1. **Group** : org.junit.platform. **Name** : junit-platform-engine. **Version** : 1.10.0.
+1. **Group** : org.junit.platform. **Name** : junit-platform-engine. **Version** : 1.12.2.
* **Project URL:** [https://junit.org/junit5/](https://junit.org/junit5/)
* **License:** [Eclipse Public License v2.0](https://www.eclipse.org/legal/epl-v20.html)
-1. **Group** : org.junit.platform. **Name** : junit-platform-launcher. **Version** : 1.10.0.
+1. **Group** : org.junit.platform. **Name** : junit-platform-launcher. **Version** : 1.12.2.
* **Project URL:** [https://junit.org/junit5/](https://junit.org/junit5/)
* **License:** [Eclipse Public License v2.0](https://www.eclipse.org/legal/epl-v20.html)
@@ -1378,7 +1541,11 @@ This report was generated on **Sun Feb 16 16:24:12 WET 2025** using [Gradle-Lice
* **License:** [BSD-3-Clause](https://asm.ow2.io/license.html)
* **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : org.pcollections. **Name** : pcollections. **Version** : 3.1.4.
+1. **Group** : org.pcollections. **Name** : pcollections. **Version** : 4.0.1.
+ * **Project URL:** [https://github.com/hrldcpr/pcollections](https://github.com/hrldcpr/pcollections)
+ * **License:** [The MIT License](https://opensource.org/licenses/mit-license.php)
+
+1. **Group** : org.pcollections. **Name** : pcollections. **Version** : 4.0.2.
* **Project URL:** [https://github.com/hrldcpr/pcollections](https://github.com/hrldcpr/pcollections)
* **License:** [The MIT License](https://opensource.org/licenses/mit-license.php)
@@ -1387,7 +1554,11 @@ This report was generated on **Sun Feb 16 16:24:12 WET 2025** using [Gradle-Lice
* **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
* **License:** [WTFPL](http://www.wtfpl.net/)
-1. **Group** : org.snakeyaml. **Name** : snakeyaml-engine. **Version** : 2.6.
+1. **Group** : org.slf4j. **Name** : jul-to-slf4j. **Version** : 1.7.36.
+ * **Project URL:** [http://www.slf4j.org](http://www.slf4j.org)
+ * **License:** [MIT License](http://www.opensource.org/licenses/mit-license.php)
+
+1. **Group** : org.snakeyaml. **Name** : snakeyaml-engine. **Version** : 2.7.
* **Project URL:** [https://bitbucket.org/snakeyaml/snakeyaml-engine](https://bitbucket.org/snakeyaml/snakeyaml-engine)
* **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
@@ -1395,34 +1566,38 @@ This report was generated on **Sun Feb 16 16:24:12 WET 2025** using [Gradle-Lice
* **Project URL:** [https://github.com/xmlresolver/xmlresolver](https://github.com/xmlresolver/xmlresolver)
* **License:** [Apache License version 2.0](https://www.apache.org/licenses/LICENSE-2.0)
+1. **Group** : org.xmlresolver. **Name** : xmlresolver. **Version** : 5.2.2.
+ * **Project URL:** [https://github.com/xmlresolver/xmlresolver](https://github.com/xmlresolver/xmlresolver)
+ * **License:** [Apache License version 2.0](https://www.apache.org/licenses/LICENSE-2.0)
+
The dependencies distributed under several licenses, are used according their commercial-use-friendly license.
-This report was generated on **Sun Feb 16 16:24:12 WET 2025** 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).
+This report was generated on **Wed May 07 19:20:12 WEST 2025** 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:prototap-protoc-plugin:0.9.1`
+# Dependencies of `io.spine.tools:prototap-protoc-plugin:0.10.0`
## Runtime
1. **Group** : com.google.code.findbugs. **Name** : jsr305. **Version** : 3.0.2.
* **Project URL:** [http://findbugs.sourceforge.net/](http://findbugs.sourceforge.net/)
* **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : com.google.code.gson. **Name** : gson. **Version** : 2.10.1.
- * **Project URL:** [https://github.com/google/gson/gson](https://github.com/google/gson/gson)
+1. **Group** : com.google.code.gson. **Name** : gson. **Version** : 2.13.0.
+ * **Project URL:** [https://github.com/google/gson](https://github.com/google/gson)
* **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : com.google.errorprone. **Name** : error_prone_annotations. **Version** : 2.23.0.
+1. **Group** : com.google.errorprone. **Name** : error_prone_annotations. **Version** : 2.36.0.
* **Project URL:** [https://errorprone.info/error_prone_annotations](https://errorprone.info/error_prone_annotations)
* **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : com.google.guava. **Name** : failureaccess. **Version** : 1.0.1.
+1. **Group** : com.google.guava. **Name** : failureaccess. **Version** : 1.0.3.
* **Project URL:** [https://github.com/google/guava/](https://github.com/google/guava/)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+ * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : com.google.guava. **Name** : guava. **Version** : 32.1.3-jre.
+1. **Group** : com.google.guava. **Name** : guava. **Version** : 33.4.8-jre.
* **Project URL:** [https://github.com/google/guava](https://github.com/google/guava)
* **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
@@ -1433,59 +1608,56 @@ This report was generated on **Sun Feb 16 16:24:12 WET 2025** using [Gradle-Lice
* **Project URL:** [https://github.com/google/j2objc/](https://github.com/google/j2objc/)
* **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : com.google.protobuf. **Name** : protobuf-java. **Version** : 3.25.1.
+1. **Group** : com.google.protobuf. **Name** : protobuf-java. **Version** : 3.25.7.
* **Project URL:** [https://developers.google.com/protocol-buffers/](https://developers.google.com/protocol-buffers/)
* **License:** [BSD-3-Clause](https://opensource.org/licenses/BSD-3-Clause)
-1. **Group** : com.google.protobuf. **Name** : protobuf-java-util. **Version** : 3.25.1.
+1. **Group** : com.google.protobuf. **Name** : protobuf-java-util. **Version** : 3.25.7.
* **Project URL:** [https://developers.google.com/protocol-buffers/](https://developers.google.com/protocol-buffers/)
* **License:** [BSD-3-Clause](https://opensource.org/licenses/BSD-3-Clause)
-1. **Group** : com.google.protobuf. **Name** : protobuf-kotlin. **Version** : 3.25.1.
+1. **Group** : com.google.protobuf. **Name** : protobuf-kotlin. **Version** : 3.25.7.
+ * **Project URL:** [https://developers.google.com/protocol-buffers/](https://developers.google.com/protocol-buffers/)
* **License:** [BSD-3-Clause](https://opensource.org/licenses/BSD-3-Clause)
-1. **Group** : org.checkerframework. **Name** : checker-qual. **Version** : 3.40.0.
- * **Project URL:** [https://checkerframework.org/](https://checkerframework.org/)
- * **License:** [The MIT License](http://opensource.org/licenses/MIT)
-
-1. **Group** : org.jetbrains. **Name** : annotations. **Version** : 24.0.1.
+1. **Group** : org.jetbrains. **Name** : annotations. **Version** : 26.0.2.
* **Project URL:** [https://github.com/JetBrains/java-annotations](https://github.com/JetBrains/java-annotations)
* **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-reflect. **Version** : 1.9.24.
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-bom. **Version** : 2.1.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-reflect. **Version** : 2.1.20.
* **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
* **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib. **Version** : 1.9.24.
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib. **Version** : 2.1.20.
* **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
* **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib-jdk7. **Version** : 1.9.24.
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib-jdk7. **Version** : 2.1.20.
* **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
* **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib-jdk8. **Version** : 1.9.24.
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib-jdk8. **Version** : 2.1.20.
* **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
* **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-coroutines-bom. **Version** : 1.10.2.
+ * **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines)
+ * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jspecify. **Name** : jspecify. **Version** : 1.0.0.
+ * **Project URL:** [http://jspecify.org/](http://jspecify.org/)
+ * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
1. **Group** : org.ow2.asm. **Name** : asm. **Version** : 9.6.
* **Project URL:** [http://asm.ow2.io/](http://asm.ow2.io/)
* **License:** [BSD-3-Clause](https://asm.ow2.io/license.html)
* **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
## Compile, tests, and tooling
-1. **Group** : aopalliance. **Name** : aopalliance. **Version** : 1.0.
- * **Project URL:** [http://aopalliance.sourceforge.net](http://aopalliance.sourceforge.net)
- * **License:** Public Domain
-
-1. **Group** : com.beust. **Name** : jcommander. **Version** : 1.48.
- * **Project URL:** [http://beust.com/jcommander](http://beust.com/jcommander)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.beust. **Name** : jcommander. **Version** : 1.82.
- * **Project URL:** [https://jcommander.org](https://jcommander.org)
- * **License:** [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
1. **Group** : com.github.ben-manes.caffeine. **Name** : caffeine. **Version** : 3.0.5.
* **Project URL:** [https://github.com/ben-manes/caffeine](https://github.com/ben-manes/caffeine)
* **License:** [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
@@ -1494,6 +1666,10 @@ This report was generated on **Sun Feb 16 16:24:12 WET 2025** using [Gradle-Lice
* **Project URL:** [https://www.github.com/KevinStern/software-and-algorithms](https://www.github.com/KevinStern/software-and-algorithms)
* **License:** [MIT License](http://www.opensource.org/licenses/mit-license.php)
+1. **Group** : com.github.oowekyala.ooxml. **Name** : nice-xml-messages. **Version** : 3.1.
+ * **Project URL:** [https://github.com/oowekyala/nice-xml-messages](https://github.com/oowekyala/nice-xml-messages)
+ * **License:** [MIT License](https://github.com/oowekyala/nice-xml-messages/tree/master/LICENSE)
+
1. **Group** : com.google.auto. **Name** : auto-common. **Version** : 1.2.2.
* **Project URL:** [https://github.com/google/auto/tree/main/common](https://github.com/google/auto/tree/main/common)
* **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
@@ -1510,27 +1686,27 @@ This report was generated on **Sun Feb 16 16:24:12 WET 2025** using [Gradle-Lice
* **Project URL:** [http://findbugs.sourceforge.net/](http://findbugs.sourceforge.net/)
* **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : com.google.code.gson. **Name** : gson. **Version** : 2.10.1.
- * **Project URL:** [https://github.com/google/gson/gson](https://github.com/google/gson/gson)
+1. **Group** : com.google.code.gson. **Name** : gson. **Version** : 2.13.0.
+ * **Project URL:** [https://github.com/google/gson](https://github.com/google/gson)
* **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : com.google.errorprone. **Name** : error_prone_annotation. **Version** : 2.23.0.
+1. **Group** : com.google.errorprone. **Name** : error_prone_annotation. **Version** : 2.36.0.
* **Project URL:** [https://errorprone.info/error_prone_annotation](https://errorprone.info/error_prone_annotation)
* **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : com.google.errorprone. **Name** : error_prone_annotations. **Version** : 2.23.0.
+1. **Group** : com.google.errorprone. **Name** : error_prone_annotations. **Version** : 2.36.0.
* **Project URL:** [https://errorprone.info/error_prone_annotations](https://errorprone.info/error_prone_annotations)
* **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : com.google.errorprone. **Name** : error_prone_check_api. **Version** : 2.23.0.
+1. **Group** : com.google.errorprone. **Name** : error_prone_check_api. **Version** : 2.36.0.
* **Project URL:** [https://errorprone.info/error_prone_check_api](https://errorprone.info/error_prone_check_api)
* **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : com.google.errorprone. **Name** : error_prone_core. **Version** : 2.23.0.
+1. **Group** : com.google.errorprone. **Name** : error_prone_core. **Version** : 2.36.0.
* **Project URL:** [https://errorprone.info/error_prone_core](https://errorprone.info/error_prone_core)
* **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : com.google.errorprone. **Name** : error_prone_type_annotations. **Version** : 2.23.0.
+1. **Group** : com.google.errorprone. **Name** : error_prone_type_annotations. **Version** : 2.36.0.
* **Project URL:** [https://errorprone.info/error_prone_type_annotations](https://errorprone.info/error_prone_type_annotations)
* **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
@@ -1546,49 +1722,49 @@ This report was generated on **Sun Feb 16 16:24:12 WET 2025** using [Gradle-Lice
* **Project URL:** [https://github.com/google/flogger](https://github.com/google/flogger)
* **License:** [Apache 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : com.google.guava. **Name** : failureaccess. **Version** : 1.0.1.
- * **Project URL:** [https://github.com/google/guava/](https://github.com/google/guava/)
+1. **Group** : com.google.googlejavaformat. **Name** : google-java-format. **Version** : 1.19.1.
* **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : com.google.guava. **Name** : guava. **Version** : 32.1.3-jre.
+1. **Group** : com.google.guava. **Name** : failureaccess. **Version** : 1.0.3.
+ * **Project URL:** [https://github.com/google/guava/](https://github.com/google/guava/)
+ * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.guava. **Name** : guava. **Version** : 33.4.8-jre.
* **Project URL:** [https://github.com/google/guava](https://github.com/google/guava)
* **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : com.google.guava. **Name** : guava-testlib. **Version** : 32.1.3-jre.
+1. **Group** : com.google.guava. **Name** : guava-testlib. **Version** : 33.4.8-jre.
* **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
1. **Group** : com.google.guava. **Name** : listenablefuture. **Version** : 9999.0-empty-to-avoid-conflict-with-guava.
* **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : com.google.inject. **Name** : guice. **Version** : 5.1.0.
- * **Project URL:** [https://github.com/google/guice](https://github.com/google/guice)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
1. **Group** : com.google.j2objc. **Name** : j2objc-annotations. **Version** : 2.8.
* **Project URL:** [https://github.com/google/j2objc/](https://github.com/google/j2objc/)
* **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : com.google.protobuf. **Name** : protobuf-java. **Version** : 3.25.1.
+1. **Group** : com.google.protobuf. **Name** : protobuf-java. **Version** : 3.25.7.
* **Project URL:** [https://developers.google.com/protocol-buffers/](https://developers.google.com/protocol-buffers/)
* **License:** [BSD-3-Clause](https://opensource.org/licenses/BSD-3-Clause)
-1. **Group** : com.google.protobuf. **Name** : protobuf-java-util. **Version** : 3.25.1.
+1. **Group** : com.google.protobuf. **Name** : protobuf-java-util. **Version** : 3.25.7.
* **Project URL:** [https://developers.google.com/protocol-buffers/](https://developers.google.com/protocol-buffers/)
* **License:** [BSD-3-Clause](https://opensource.org/licenses/BSD-3-Clause)
-1. **Group** : com.google.protobuf. **Name** : protobuf-kotlin. **Version** : 3.25.1.
+1. **Group** : com.google.protobuf. **Name** : protobuf-kotlin. **Version** : 3.25.7.
+ * **Project URL:** [https://developers.google.com/protocol-buffers/](https://developers.google.com/protocol-buffers/)
* **License:** [BSD-3-Clause](https://opensource.org/licenses/BSD-3-Clause)
-1. **Group** : com.google.truth. **Name** : truth. **Version** : 1.1.5.
+1. **Group** : com.google.truth. **Name** : truth. **Version** : 1.4.4.
* **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : com.google.truth.extensions. **Name** : truth-java8-extension. **Version** : 1.1.5.
+1. **Group** : com.google.truth.extensions. **Name** : truth-java8-extension. **Version** : 1.4.4.
* **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : com.google.truth.extensions. **Name** : truth-liteproto-extension. **Version** : 1.1.5.
+1. **Group** : com.google.truth.extensions. **Name** : truth-liteproto-extension. **Version** : 1.4.4.
* **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : com.google.truth.extensions. **Name** : truth-proto-extension. **Version** : 1.1.5.
+1. **Group** : com.google.truth.extensions. **Name** : truth-proto-extension. **Version** : 1.4.4.
* **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
1. **Group** : com.puppycrawl.tools. **Name** : checkstyle. **Version** : 10.12.1.
@@ -1607,6 +1783,14 @@ This report was generated on **Sun Feb 16 16:24:12 WET 2025** using [Gradle-Lice
* **Project URL:** [http://commons.apache.org/collections/](http://commons.apache.org/collections/)
* **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+1. **Group** : dev.drewhamilton.poko. **Name** : poko-annotations. **Version** : 0.17.1.
+ * **Project URL:** [https://github.com/drewhamilton/Poko](https://github.com/drewhamilton/Poko)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : dev.drewhamilton.poko. **Name** : poko-annotations-jvm. **Version** : 0.17.1.
+ * **Project URL:** [https://github.com/drewhamilton/Poko](https://github.com/drewhamilton/Poko)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
1. **Group** : info.picocli. **Name** : picocli. **Version** : 4.7.4.
* **Project URL:** [https://picocli.info](https://picocli.info)
* **License:** [The Apache Software License, version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
@@ -1615,187 +1799,197 @@ This report was generated on **Sun Feb 16 16:24:12 WET 2025** using [Gradle-Lice
* **Project URL:** [https://github.com/davidburstrom/contester](https://github.com/davidburstrom/contester)
* **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : io.github.detekt.sarif4k. **Name** : sarif4k. **Version** : 0.4.0.
+1. **Group** : io.github.detekt.sarif4k. **Name** : sarif4k. **Version** : 0.6.0.
* **Project URL:** [https://detekt.github.io/detekt](https://detekt.github.io/detekt)
* **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : io.github.detekt.sarif4k. **Name** : sarif4k-jvm. **Version** : 0.4.0.
+1. **Group** : io.github.detekt.sarif4k. **Name** : sarif4k-jvm. **Version** : 0.6.0.
* **Project URL:** [https://detekt.github.io/detekt](https://detekt.github.io/detekt)
* **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : io.github.eisop. **Name** : dataflow-errorprone. **Version** : 3.34.0-eisop1.
+1. **Group** : io.github.eisop. **Name** : dataflow-errorprone. **Version** : 3.41.0-eisop1.
* **Project URL:** [https://eisop.github.io/](https://eisop.github.io/)
* **License:** [GNU General Public License, version 2 (GPL2), with the classpath exception](http://www.gnu.org/software/classpath/license.html)
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.gitlab.arturbosch.detekt. **Name** : detekt-api. **Version** : 1.23.0.
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-api. **Version** : 1.23.8.
* **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.gitlab.arturbosch.detekt. **Name** : detekt-cli. **Version** : 1.23.0.
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-cli. **Version** : 1.23.8.
* **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.gitlab.arturbosch.detekt. **Name** : detekt-core. **Version** : 1.23.0.
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-core. **Version** : 1.23.8.
* **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.gitlab.arturbosch.detekt. **Name** : detekt-metrics. **Version** : 1.23.0.
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-metrics. **Version** : 1.23.8.
* **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.gitlab.arturbosch.detekt. **Name** : detekt-parser. **Version** : 1.23.0.
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-parser. **Version** : 1.23.8.
* **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.gitlab.arturbosch.detekt. **Name** : detekt-psi-utils. **Version** : 1.23.0.
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-psi-utils. **Version** : 1.23.8.
* **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.gitlab.arturbosch.detekt. **Name** : detekt-report-html. **Version** : 1.23.0.
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-report-html. **Version** : 1.23.8.
* **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.gitlab.arturbosch.detekt. **Name** : detekt-report-md. **Version** : 1.23.0.
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-report-md. **Version** : 1.23.8.
* **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.gitlab.arturbosch.detekt. **Name** : detekt-report-sarif. **Version** : 1.23.0.
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-report-sarif. **Version** : 1.23.8.
* **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.gitlab.arturbosch.detekt. **Name** : detekt-report-txt. **Version** : 1.23.0.
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-report-txt. **Version** : 1.23.8.
* **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.gitlab.arturbosch.detekt. **Name** : detekt-report-xml. **Version** : 1.23.0.
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-report-xml. **Version** : 1.23.8.
* **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.gitlab.arturbosch.detekt. **Name** : detekt-rules. **Version** : 1.23.0.
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-rules. **Version** : 1.23.8.
* **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.gitlab.arturbosch.detekt. **Name** : detekt-rules-complexity. **Version** : 1.23.0.
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-rules-complexity. **Version** : 1.23.8.
* **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.gitlab.arturbosch.detekt. **Name** : detekt-rules-coroutines. **Version** : 1.23.0.
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-rules-coroutines. **Version** : 1.23.8.
* **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.gitlab.arturbosch.detekt. **Name** : detekt-rules-documentation. **Version** : 1.23.0.
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-rules-documentation. **Version** : 1.23.8.
* **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.gitlab.arturbosch.detekt. **Name** : detekt-rules-empty. **Version** : 1.23.0.
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-rules-empty. **Version** : 1.23.8.
* **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.gitlab.arturbosch.detekt. **Name** : detekt-rules-errorprone. **Version** : 1.23.0.
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-rules-errorprone. **Version** : 1.23.8.
* **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.gitlab.arturbosch.detekt. **Name** : detekt-rules-exceptions. **Version** : 1.23.0.
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-rules-exceptions. **Version** : 1.23.8.
* **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.gitlab.arturbosch.detekt. **Name** : detekt-rules-naming. **Version** : 1.23.0.
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-rules-naming. **Version** : 1.23.8.
* **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.gitlab.arturbosch.detekt. **Name** : detekt-rules-performance. **Version** : 1.23.0.
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-rules-performance. **Version** : 1.23.8.
* **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.gitlab.arturbosch.detekt. **Name** : detekt-rules-style. **Version** : 1.23.0.
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-rules-style. **Version** : 1.23.8.
* **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.gitlab.arturbosch.detekt. **Name** : detekt-tooling. **Version** : 1.23.0.
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-tooling. **Version** : 1.23.8.
* **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.gitlab.arturbosch.detekt. **Name** : detekt-utils. **Version** : 1.23.0.
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-utils. **Version** : 1.23.8.
* **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-api. **Version** : 5.8.0.
+1. **Group** : io.kotest. **Name** : kotest-assertions-api. **Version** : 5.9.1.
* **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-api-jvm. **Version** : 5.8.0.
+1. **Group** : io.kotest. **Name** : kotest-assertions-api-jvm. **Version** : 5.9.1.
* **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. **Version** : 5.8.0.
+1. **Group** : io.kotest. **Name** : kotest-assertions-core. **Version** : 5.9.1.
* **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** : 5.8.0.
+1. **Group** : io.kotest. **Name** : kotest-assertions-core-jvm. **Version** : 5.9.1.
* **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** : 5.8.0.
+1. **Group** : io.kotest. **Name** : kotest-assertions-shared. **Version** : 5.9.1.
* **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** : 5.8.0.
+1. **Group** : io.kotest. **Name** : kotest-assertions-shared-jvm. **Version** : 5.9.1.
* **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** : 5.8.0.
+1. **Group** : io.kotest. **Name** : kotest-common. **Version** : 5.9.1.
* **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** : 5.8.0.
+1. **Group** : io.kotest. **Name** : kotest-common-jvm. **Version** : 5.9.1.
* **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** : javax.annotation. **Name** : javax.annotation-api. **Version** : 1.3.2.
- * **Project URL:** [http://jcp.org/en/jsr/detail?id=250](http://jcp.org/en/jsr/detail?id=250)
- * **License:** [CDDL + GPLv2 with classpath exception](https://github.com/javaee/javax.annotation/blob/master/LICENSE)
+1. **Group** : io.kotest. **Name** : kotest-framework-api. **Version** : 5.9.1.
+ * **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-framework-api-jvm. **Version** : 5.9.1.
+ * **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-framework-datatest. **Version** : 5.9.1.
+ * **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-framework-datatest-jvm. **Version** : 5.9.1.
+ * **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** : javax.inject. **Name** : javax.inject. **Version** : 1.
* **Project URL:** [http://code.google.com/p/atinject/](http://code.google.com/p/atinject/)
* **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : junit. **Name** : junit. **Version** : 4.13.1.
+1. **Group** : junit. **Name** : junit. **Version** : 4.13.2.
* **Project URL:** [http://junit.org](http://junit.org)
* **License:** [Eclipse Public License 1.0](http://www.eclipse.org/legal/epl-v10.html)
-1. **Group** : net.java.dev.jna. **Name** : jna. **Version** : 5.6.0.
- * **Project URL:** [https://github.com/java-native-access/jna](https://github.com/java-native-access/jna)
- * **License:** [Apache License v2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
- * **License:** [LGPL, version 2.1](http://www.gnu.org/licenses/licenses.html)
-
1. **Group** : net.sf.saxon. **Name** : Saxon-HE. **Version** : 12.2.
* **Project URL:** [http://www.saxonica.com/](http://www.saxonica.com/)
* **License:** [Mozilla Public License Version 2.0](http://www.mozilla.org/MPL/2.0/)
-1. **Group** : net.sourceforge.pmd. **Name** : pmd-core. **Version** : 6.55.0.
+1. **Group** : net.sf.saxon. **Name** : Saxon-HE. **Version** : 12.5.
+ * **Project URL:** [http://www.saxonica.com/](http://www.saxonica.com/)
+ * **License:** [Mozilla Public License Version 2.0](http://www.mozilla.org/MPL/2.0/)
+
+1. **Group** : net.sourceforge.pmd. **Name** : pmd-ant. **Version** : 7.12.0.
* **License:** [BSD-style](http://pmd.sourceforge.net/license.html)
-1. **Group** : net.sourceforge.pmd. **Name** : pmd-java. **Version** : 6.55.0.
+1. **Group** : net.sourceforge.pmd. **Name** : pmd-core. **Version** : 7.12.0.
* **License:** [BSD-style](http://pmd.sourceforge.net/license.html)
-1. **Group** : net.sourceforge.saxon. **Name** : saxon. **Version** : 9.1.0.8.
- * **Project URL:** [http://saxon.sourceforge.net/](http://saxon.sourceforge.net/)
- * **License:** [Mozilla Public License Version 1.0](http://www.mozilla.org/MPL/MPL-1.0.txt)
+1. **Group** : net.sourceforge.pmd. **Name** : pmd-java. **Version** : 7.12.0.
+ * **License:** [BSD-style](http://pmd.sourceforge.net/license.html)
1. **Group** : org.antlr. **Name** : antlr4-runtime. **Version** : 4.11.1.
* **Project URL:** [https://www.antlr.org/](https://www.antlr.org/)
* **License:** [BSD-3-Clause](https://www.antlr.org/license.html)
-1. **Group** : org.antlr. **Name** : antlr4-runtime. **Version** : 4.7.2.
+1. **Group** : org.antlr. **Name** : antlr4-runtime. **Version** : 4.9.3.
* **Project URL:** [http://www.antlr.org](http://www.antlr.org)
* **License:** [The BSD License](http://www.antlr.org/license.html)
-1. **Group** : org.apache.commons. **Name** : commons-lang3. **Version** : 3.8.1.
- * **Project URL:** [http://commons.apache.org/proper/commons-lang/](http://commons.apache.org/proper/commons-lang/)
- * **License:** [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+1. **Group** : org.apache.commons. **Name** : commons-lang3. **Version** : 3.17.0.
+ * **Project URL:** [https://commons.apache.org/proper/commons-lang/](https://commons.apache.org/proper/commons-lang/)
+ * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
1. **Group** : org.apache.httpcomponents.client5. **Name** : httpclient5. **Version** : 5.1.3.
* **License:** [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
@@ -1819,13 +2013,13 @@ This report was generated on **Sun Feb 16 16:24:12 WET 2025** using [Gradle-Lice
* **Project URL:** [https://checkerframework.org/](https://checkerframework.org/)
* **License:** [The MIT License](http://opensource.org/licenses/MIT)
-1. **Group** : org.hamcrest. **Name** : hamcrest. **Version** : 2.2.
+1. **Group** : org.hamcrest. **Name** : hamcrest. **Version** : 3.0.
* **Project URL:** [http://hamcrest.org/JavaHamcrest/](http://hamcrest.org/JavaHamcrest/)
- * **License:** [BSD License 3](http://opensource.org/licenses/BSD-3-Clause)
+ * **License:** [BSD-3-Clause](https://raw.githubusercontent.com/hamcrest/JavaHamcrest/master/LICENSE)
-1. **Group** : org.hamcrest. **Name** : hamcrest-core. **Version** : 2.2.
+1. **Group** : org.hamcrest. **Name** : hamcrest-core. **Version** : 3.0.
* **Project URL:** [http://hamcrest.org/JavaHamcrest/](http://hamcrest.org/JavaHamcrest/)
- * **License:** [BSD License 3](http://opensource.org/licenses/BSD-3-Clause)
+ * **License:** [BSD-3-Clause](https://raw.githubusercontent.com/hamcrest/JavaHamcrest/master/LICENSE)
1. **Group** : org.jacoco. **Name** : org.jacoco.agent. **Version** : 0.8.12.
* **License:** [EPL-2.0](https://www.eclipse.org/legal/epl-2.0/)
@@ -1845,7 +2039,11 @@ This report was generated on **Sun Feb 16 16:24:12 WET 2025** using [Gradle-Lice
* **License:** [LGPL 2.1](http://www.gnu.org/licenses/lgpl-2.1.html)
* **License:** [MPL 1.1](http://www.mozilla.org/MPL/MPL-1.1.html)
-1. **Group** : org.jetbrains. **Name** : annotations. **Version** : 24.0.1.
+1. **Group** : org.jcommander. **Name** : jcommander. **Version** : 1.85.
+ * **Project URL:** [https://jcommander.org](https://jcommander.org)
+ * **License:** [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains. **Name** : annotations. **Version** : 26.0.2.
* **Project URL:** [https://github.com/JetBrains/java-annotations](https://github.com/JetBrains/java-annotations)
* **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
@@ -1853,89 +2051,141 @@ This report was generated on **Sun Feb 16 16:24:12 WET 2025** using [Gradle-Lice
* **Project URL:** [https://github.com/JetBrains/intellij-deps-trove4j](https://github.com/JetBrains/intellij-deps-trove4j)
* **License:** [GNU LESSER GENERAL PUBLIC LICENSE 2.1](https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html)
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-compiler-embeddable. **Version** : 1.8.21.
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-bom. **Version** : 2.1.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-build-tools-api. **Version** : 2.1.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-build-tools-impl. **Version** : 2.1.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-compiler-embeddable. **Version** : 2.0.21.
* **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
* **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-compiler-embeddable. **Version** : 1.8.22.
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-compiler-embeddable. **Version** : 2.1.20.
* **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
* **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-daemon-embeddable. **Version** : 1.8.21.
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-compiler-runner. **Version** : 2.1.20.
* **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
* **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-daemon-embeddable. **Version** : 1.8.22.
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-daemon-client. **Version** : 2.1.20.
* **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
* **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-klib-commonizer-embeddable. **Version** : 1.8.22.
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-daemon-embeddable. **Version** : 2.0.21.
* **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
* **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-reflect. **Version** : 1.9.24.
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-daemon-embeddable. **Version** : 2.1.20.
* **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
* **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-script-runtime. **Version** : 1.8.21.
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-klib-commonizer-embeddable. **Version** : 2.1.20.
* **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
* **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-script-runtime. **Version** : 1.8.22.
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-reflect. **Version** : 2.0.21.
* **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
* **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-scripting-common. **Version** : 1.8.22.
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-reflect. **Version** : 2.1.20.
* **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
* **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-scripting-compiler-embeddable. **Version** : 1.8.22.
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-script-runtime. **Version** : 2.0.21.
* **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
* **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-scripting-compiler-impl-embeddable. **Version** : 1.8.22.
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-script-runtime. **Version** : 2.1.20.
* **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
* **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-scripting-jvm. **Version** : 1.8.22.
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-scripting-common. **Version** : 2.1.20.
* **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
* **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib. **Version** : 1.9.24.
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-scripting-compiler-embeddable. **Version** : 2.1.20.
* **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
* **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib-common. **Version** : 1.9.24.
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-scripting-compiler-impl-embeddable. **Version** : 2.1.20.
* **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
* **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib-jdk7. **Version** : 1.9.24.
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-scripting-jvm. **Version** : 2.1.20.
* **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
* **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib-jdk8. **Version** : 1.9.24.
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib. **Version** : 2.0.21.
* **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
* **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : org.jetbrains.kotlinx. **Name** : atomicfu. **Version** : 0.17.3.
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib. **Version** : 2.1.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib-common. **Version** : 2.0.21.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib-common. **Version** : 2.1.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib-jdk7. **Version** : 2.0.21.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib-jdk7. **Version** : 2.1.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib-jdk8. **Version** : 2.0.21.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib-jdk8. **Version** : 2.1.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlinx. **Name** : atomicfu. **Version** : 0.23.1.
* **Project URL:** [https://github.com/Kotlin/kotlinx.atomicfu](https://github.com/Kotlin/kotlinx.atomicfu)
* **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-coroutines-bom. **Version** : 1.6.4.
+1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-coroutines-bom. **Version** : 1.10.2.
* **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines)
- * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+ * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-coroutines-core. **Version** : 1.6.4.
+1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-coroutines-core. **Version** : 1.10.2.
* **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines)
- * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+ * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-coroutines-core-jvm. **Version** : 1.10.2.
+ * **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines)
+ * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-coroutines-core-jvm. **Version** : 1.6.4.
* **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines)
* **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-coroutines-jdk8. **Version** : 1.6.4.
+1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-coroutines-jdk8. **Version** : 1.10.2.
* **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines)
- * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+ * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-coroutines-test. **Version** : 1.10.2.
+ * **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines)
+ * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-coroutines-test-jvm. **Version** : 1.10.2.
+ * **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines)
+ * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-html-jvm. **Version** : 0.8.1.
* **Project URL:** [https://github.com/Kotlin/kotlinx.html](https://github.com/Kotlin/kotlinx.html)
@@ -1957,27 +2207,39 @@ This report was generated on **Sun Feb 16 16:24:12 WET 2025** using [Gradle-Lice
* **Project URL:** [https://github.com/Kotlin/kotlinx.serialization](https://github.com/Kotlin/kotlinx.serialization)
* **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : org.junit. **Name** : junit-bom. **Version** : 5.10.0.
+1. **Group** : org.jspecify. **Name** : jspecify. **Version** : 1.0.0.
+ * **Project URL:** [http://jspecify.org/](http://jspecify.org/)
+ * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.junit. **Name** : junit-bom. **Version** : 5.12.2.
+ * **Project URL:** [https://junit.org/junit5/](https://junit.org/junit5/)
+ * **License:** [Eclipse Public License v2.0](https://www.eclipse.org/legal/epl-v20.html)
+
+1. **Group** : org.junit-pioneer. **Name** : junit-pioneer. **Version** : 2.3.0.
+ * **Project URL:** [https://junit-pioneer.org/](https://junit-pioneer.org/)
+ * **License:** [Eclipse Public License v2.0](https://www.eclipse.org/legal/epl-v20.html)
+
+1. **Group** : org.junit.jupiter. **Name** : junit-jupiter-api. **Version** : 5.12.2.
* **Project URL:** [https://junit.org/junit5/](https://junit.org/junit5/)
* **License:** [Eclipse Public License v2.0](https://www.eclipse.org/legal/epl-v20.html)
-1. **Group** : org.junit.jupiter. **Name** : junit-jupiter-api. **Version** : 5.10.0.
+1. **Group** : org.junit.jupiter. **Name** : junit-jupiter-engine. **Version** : 5.12.2.
* **Project URL:** [https://junit.org/junit5/](https://junit.org/junit5/)
* **License:** [Eclipse Public License v2.0](https://www.eclipse.org/legal/epl-v20.html)
-1. **Group** : org.junit.jupiter. **Name** : junit-jupiter-engine. **Version** : 5.10.0.
+1. **Group** : org.junit.jupiter. **Name** : junit-jupiter-params. **Version** : 5.12.2.
* **Project URL:** [https://junit.org/junit5/](https://junit.org/junit5/)
* **License:** [Eclipse Public License v2.0](https://www.eclipse.org/legal/epl-v20.html)
-1. **Group** : org.junit.jupiter. **Name** : junit-jupiter-params. **Version** : 5.10.0.
+1. **Group** : org.junit.platform. **Name** : junit-platform-commons. **Version** : 1.12.2.
* **Project URL:** [https://junit.org/junit5/](https://junit.org/junit5/)
* **License:** [Eclipse Public License v2.0](https://www.eclipse.org/legal/epl-v20.html)
-1. **Group** : org.junit.platform. **Name** : junit-platform-commons. **Version** : 1.10.0.
+1. **Group** : org.junit.platform. **Name** : junit-platform-engine. **Version** : 1.12.2.
* **Project URL:** [https://junit.org/junit5/](https://junit.org/junit5/)
* **License:** [Eclipse Public License v2.0](https://www.eclipse.org/legal/epl-v20.html)
-1. **Group** : org.junit.platform. **Name** : junit-platform-engine. **Version** : 1.10.0.
+1. **Group** : org.junit.platform. **Name** : junit-platform-launcher. **Version** : 1.12.2.
* **Project URL:** [https://junit.org/junit5/](https://junit.org/junit5/)
* **License:** [Eclipse Public License v2.0](https://www.eclipse.org/legal/epl-v20.html)
@@ -2000,7 +2262,11 @@ This report was generated on **Sun Feb 16 16:24:12 WET 2025** using [Gradle-Lice
* **License:** [BSD-3-Clause](https://asm.ow2.io/license.html)
* **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : org.pcollections. **Name** : pcollections. **Version** : 3.1.4.
+1. **Group** : org.pcollections. **Name** : pcollections. **Version** : 4.0.1.
+ * **Project URL:** [https://github.com/hrldcpr/pcollections](https://github.com/hrldcpr/pcollections)
+ * **License:** [The MIT License](https://opensource.org/licenses/mit-license.php)
+
+1. **Group** : org.pcollections. **Name** : pcollections. **Version** : 4.0.2.
* **Project URL:** [https://github.com/hrldcpr/pcollections](https://github.com/hrldcpr/pcollections)
* **License:** [The MIT License](https://opensource.org/licenses/mit-license.php)
@@ -2009,7 +2275,11 @@ This report was generated on **Sun Feb 16 16:24:12 WET 2025** using [Gradle-Lice
* **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
* **License:** [WTFPL](http://www.wtfpl.net/)
-1. **Group** : org.snakeyaml. **Name** : snakeyaml-engine. **Version** : 2.6.
+1. **Group** : org.slf4j. **Name** : jul-to-slf4j. **Version** : 1.7.36.
+ * **Project URL:** [http://www.slf4j.org](http://www.slf4j.org)
+ * **License:** [MIT License](http://www.opensource.org/licenses/mit-license.php)
+
+1. **Group** : org.snakeyaml. **Name** : snakeyaml-engine. **Version** : 2.7.
* **Project URL:** [https://bitbucket.org/snakeyaml/snakeyaml-engine](https://bitbucket.org/snakeyaml/snakeyaml-engine)
* **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
@@ -2017,7 +2287,11 @@ This report was generated on **Sun Feb 16 16:24:12 WET 2025** using [Gradle-Lice
* **Project URL:** [https://github.com/xmlresolver/xmlresolver](https://github.com/xmlresolver/xmlresolver)
* **License:** [Apache License version 2.0](https://www.apache.org/licenses/LICENSE-2.0)
+1. **Group** : org.xmlresolver. **Name** : xmlresolver. **Version** : 5.2.2.
+ * **Project URL:** [https://github.com/xmlresolver/xmlresolver](https://github.com/xmlresolver/xmlresolver)
+ * **License:** [Apache License version 2.0](https://www.apache.org/licenses/LICENSE-2.0)
+
The dependencies distributed under several licenses, are used according their commercial-use-friendly license.
-This report was generated on **Sun Feb 16 16:24:13 WET 2025** 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
+This report was generated on **Wed May 07 19:20:13 WEST 2025** 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/gradle-plugin/build.gradle.kts b/gradle-plugin/build.gradle.kts
index 933bb4a..9f73ab7 100644
--- a/gradle-plugin/build.gradle.kts
+++ b/gradle-plugin/build.gradle.kts
@@ -24,6 +24,8 @@
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
+@file:Suppress("unused")
+
import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar
import io.spine.dependency.lib.Kotlin
import io.spine.dependency.lib.Protobuf
@@ -48,7 +50,7 @@ dependencies {
api(project(":api"))
implementation(ToolBase.pluginBase)
- implementation(Kotlin.gradlePluginApi)
+ implementation(Kotlin.GradlePlugin.api)
}
@Suppress(
@@ -59,7 +61,7 @@ testing {
val test by getting(JvmTestSuite::class) {
useJUnitJupiter(JUnit.version)
dependencies {
- implementation(Kotlin.gradlePluginLib)
+ implementation(Kotlin.GradlePlugin.lib)
implementation(gradleKotlinDsl())
implementation(Protobuf.GradlePlugin.lib)
implementation(ToolBase.pluginTestlib)
diff --git a/gradle-plugin/src/main/kotlin/io/spine/tools/prototap/gradle/Plugin.kt b/gradle-plugin/src/main/kotlin/io/spine/tools/prototap/gradle/Plugin.kt
index c687138..9b587e6 100644
--- a/gradle-plugin/src/main/kotlin/io/spine/tools/prototap/gradle/Plugin.kt
+++ b/gradle-plugin/src/main/kotlin/io/spine/tools/prototap/gradle/Plugin.kt
@@ -122,10 +122,10 @@ private fun Project.createProtocPlugin() = protobufExtension?.run {
private val protocPlugin: Artifact by lazy {
artifact {
useSpineToolsGroup()
- name = "prototap-protoc-plugin"
- version = io.spine.tools.prototap.gradle.Plugin.readVersion()
- classifier = PROTOC_PLUGIN_CLASSIFIER
- extension = "jar"
+ setName("prototap-protoc-plugin")
+ setVersion(io.spine.tools.prototap.gradle.Plugin.readVersion())
+ setClassifier(PROTOC_PLUGIN_CLASSIFIER)
+ setExtension("jar")
}
}
diff --git a/gradle-plugin/src/test/resources/before-test-fixtures/build.gradle.kts b/gradle-plugin/src/test/resources/before-test-fixtures/build.gradle.kts
index aa6b582..06587ff 100644
--- a/gradle-plugin/src/test/resources/before-test-fixtures/build.gradle.kts
+++ b/gradle-plugin/src/test/resources/before-test-fixtures/build.gradle.kts
@@ -27,7 +27,7 @@
import com.google.protobuf.gradle.protobuf
import io.spine.dependency.lib.Protobuf
import io.spine.dependency.lib.GoogleApis
-import io.spine.gradle.standardToSpineSdk
+import io.spine.gradle.repo.standardToSpineSdk
buildscript {
standardSpineSdkRepositories()
diff --git a/gradle-plugin/src/test/resources/default-values/build.gradle.kts b/gradle-plugin/src/test/resources/default-values/build.gradle.kts
index 7c104ba..3e7cc92 100644
--- a/gradle-plugin/src/test/resources/default-values/build.gradle.kts
+++ b/gradle-plugin/src/test/resources/default-values/build.gradle.kts
@@ -27,7 +27,7 @@
import com.google.protobuf.gradle.protobuf
import io.spine.dependency.lib.Protobuf
import io.spine.dependency.lib.GoogleApis
-import io.spine.gradle.standardToSpineSdk
+import io.spine.gradle.repo.standardToSpineSdk
buildscript {
standardSpineSdkRepositories()
diff --git a/gradle-plugin/src/test/resources/proto-in-test/build.gradle.kts b/gradle-plugin/src/test/resources/proto-in-test/build.gradle.kts
index 58a17a2..3a75271 100644
--- a/gradle-plugin/src/test/resources/proto-in-test/build.gradle.kts
+++ b/gradle-plugin/src/test/resources/proto-in-test/build.gradle.kts
@@ -27,7 +27,7 @@
import com.google.protobuf.gradle.protobuf
import io.spine.dependency.lib.GoogleApis
import io.spine.dependency.lib.Protobuf
-import io.spine.gradle.standardToSpineSdk
+import io.spine.gradle.repo.standardToSpineSdk
buildscript {
standardSpineSdkRepositories()
diff --git a/gradle-plugin/src/test/resources/via-classpath/build.gradle.kts b/gradle-plugin/src/test/resources/via-classpath/build.gradle.kts
index 2a3eedf..a0a703e 100644
--- a/gradle-plugin/src/test/resources/via-classpath/build.gradle.kts
+++ b/gradle-plugin/src/test/resources/via-classpath/build.gradle.kts
@@ -27,7 +27,7 @@
import com.google.protobuf.gradle.protobuf
import io.spine.dependency.lib.Protobuf
import io.spine.dependency.lib.GoogleApis
-import io.spine.gradle.standardToSpineSdk
+import io.spine.gradle.repo.standardToSpineSdk
buildscript {
standardSpineSdkRepositories()
diff --git a/gradle-plugin/src/test/resources/with-settings/build.gradle.kts b/gradle-plugin/src/test/resources/with-settings/build.gradle.kts
index 369f4e1..74c2217 100644
--- a/gradle-plugin/src/test/resources/with-settings/build.gradle.kts
+++ b/gradle-plugin/src/test/resources/with-settings/build.gradle.kts
@@ -28,7 +28,7 @@ import com.google.protobuf.gradle.protobuf
import io.spine.dependency.lib.GoogleApis
import io.spine.dependency.test.JUnit
import io.spine.dependency.lib.Protobuf
-import io.spine.gradle.standardToSpineSdk
+import io.spine.gradle.repo.standardToSpineSdk
buildscript {
standardSpineSdkRepositories()
diff --git a/gradle.properties b/gradle.properties
index 73833cf..7f9174c 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -1,5 +1,11 @@
-kotlin.code.style=official
+# Dokka plugin eats more memory than usual. Therefore, all builds should have enough.
org.gradle.jvmargs=-Xmx8g -Xms256m -XX:MaxMetaspaceSize=1512m -XX:+UseParallelGC
+
org.gradle.daemon=false
org.gradle.parallel=false
org.gradle.workers.max=1
+
+# Enables the Dokka migration mode from v1 to v2.
+# For details please see:
+# https://kotlinlang.org/docs/dokka-migration.html#enable-migration-helpers
+org.jetbrains.dokka.experimental.gradle.pluginMode=V2EnabledWithHelpers
diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar
index afba109..9bbc975 100644
Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
index 9bf7bd3..37f853b 100644
--- a/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -1,6 +1,7 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-8.12.1-bin.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-bin.zip
networkTimeout=10000
+validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
diff --git a/gradlew b/gradlew
index 65dcd68..965e398 100755
--- a/gradlew
+++ b/gradlew
@@ -7,7 +7,7 @@
# 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
+# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
@@ -55,7 +55,7 @@
# Darwin, MinGW, and NonStop.
#
# (3) This script is generated from the Groovy template
-# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
+# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
# within the Gradle project.
#
# You can find Gradle at https://github.com/gradle/gradle/.
@@ -83,10 +83,8 @@ done
# This is normally unused
# shellcheck disable=SC2034
APP_BASE_NAME=${0##*/}
-APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit
-
-# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
-DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
+# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036)
+APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || exit
# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD=maximum
@@ -133,10 +131,13 @@ location of your Java installation."
fi
else
JAVACMD=java
- which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+ if ! command -v java >/dev/null 2>&1
+ then
+ die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
+ fi
fi
# Increase the maximum file descriptors if we can.
@@ -144,7 +145,7 @@ if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
case $MAX_FD in #(
max*)
# In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked.
- # shellcheck disable=SC3045
+ # shellcheck disable=SC2039,SC3045
MAX_FD=$( ulimit -H -n ) ||
warn "Could not query maximum file descriptor limit"
esac
@@ -152,7 +153,7 @@ if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
'' | soft) :;; #(
*)
# In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked.
- # shellcheck disable=SC3045
+ # shellcheck disable=SC2039,SC3045
ulimit -n "$MAX_FD" ||
warn "Could not set maximum file descriptor limit to $MAX_FD"
esac
@@ -197,11 +198,15 @@ if "$cygwin" || "$msys" ; then
done
fi
-# Collect all arguments for the java command;
-# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of
-# shell script including quotes and variable substitutions, so put them in
-# double quotes to make sure that they get re-expanded; and
-# * put everything else in single quotes, so that it's not re-expanded.
+
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
+
+# Collect all arguments for the java command:
+# * DEFAULT_JVM_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments,
+# and any embedded shellness will be escaped.
+# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be
+# treated as '${Hostname}' itself on the command line.
set -- \
"-Dorg.gradle.appname=$APP_BASE_NAME" \
diff --git a/gradlew.bat b/gradlew.bat
index 93e3f59..9d21a21 100644
--- a/gradlew.bat
+++ b/gradlew.bat
@@ -13,6 +13,8 @@
@rem See the License for the specific language governing permissions and
@rem limitations under the License.
@rem
+@rem SPDX-License-Identifier: Apache-2.0
+@rem
@if "%DEBUG%"=="" @echo off
@rem ##########################################################################
@@ -43,11 +45,11 @@ set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
if %ERRORLEVEL% equ 0 goto execute
-echo.
-echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
-echo.
-echo Please set the JAVA_HOME variable in your environment to match the
-echo location of your Java installation.
+echo. 1>&2
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2
+echo. 1>&2
+echo Please set the JAVA_HOME variable in your environment to match the 1>&2
+echo location of your Java installation. 1>&2
goto fail
@@ -57,11 +59,11 @@ set JAVA_EXE=%JAVA_HOME%/bin/java.exe
if exist "%JAVA_EXE%" goto execute
-echo.
-echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
-echo.
-echo Please set the JAVA_HOME variable in your environment to match the
-echo location of your Java installation.
+echo. 1>&2
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2
+echo. 1>&2
+echo Please set the JAVA_HOME variable in your environment to match the 1>&2
+echo location of your Java installation. 1>&2
goto fail
diff --git a/pom.xml b/pom.xml
index ba855f8..3725a7d 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1,5 +1,4 @@
-
4.0.0
io.spine.tools
ProtoTap
-0.9.0
+0.10.0
2015
@@ -27,109 +26,121 @@ all modules and does not describe the project structure per-subproject.
com.google.protobuf
protobuf-java
- 3.25.1
+ 3.25.7
compile
io.spine
spine-base
- 2.0.0-SNAPSHOT.241
+ 2.0.0-SNAPSHOT.316
compile
io.spine.tools
spine-plugin-base
- 2.0.0-SNAPSHOT.244
+ 2.0.0-SNAPSHOT.321
+ compile
+
+
+ org.jetbrains.kotlin
+ kotlin-bom
+ 2.1.20
compile
org.jetbrains.kotlin
kotlin-gradle-plugin-api
- 1.9.24
+ 2.1.20
compile
org.jetbrains.kotlin
- kotlin-stdlib-jdk8
- 1.9.24
+ kotlin-stdlib
+ 2.1.20
compile
- com.google.guava
- guava-testlib
- 32.1.3-jre
- test
+ org.jetbrains.kotlinx
+ kotlinx-coroutines-bom
+ 1.10.2
+ compile
- com.google.truth
- truth
- 1.1.5
+ com.google.guava
+ guava-testlib
+ 33.4.8-jre
test
- com.google.truth.extensions
- truth-java8-extension
- 1.1.5
+ io.kotest
+ kotest-assertions-core
+ 5.9.1
test
- com.google.truth.extensions
- truth-proto-extension
- 1.1.5
+ io.kotest
+ kotest-framework-datatest
+ 5.9.1
test
io.spine.tools
spine-plugin-testlib
- 2.0.0-SNAPSHOT.244
+ 2.0.0-SNAPSHOT.321
test
io.spine.tools
spine-testlib
- 2.0.0-SNAPSHOT.185
+ 2.0.0-SNAPSHOT.202
+ test
+
+
+ org.jetbrains.kotlin
+ kotlin-gradle-plugin
+ 2.1.20
test
- org.apiguardian
- apiguardian-api
- 1.1.2
+ org.junit
+ junit-bom
+ 5.12.2
test
- org.jetbrains.kotlin
- kotlin-gradle-plugin
- 1.9.24
+ org.junit-pioneer
+ junit-pioneer
+ 2.3.0
test
org.junit.jupiter
junit-jupiter
- 5.10.0
+ 5.12.2
test
org.junit.jupiter
junit-jupiter-api
- 5.10.0
+ 5.12.2
test
org.junit.jupiter
junit-jupiter-engine
- 5.10.0
+ 5.12.2
test
org.junit.jupiter
junit-jupiter-params
- 5.10.0
+ 5.12.2
test
org.junit.platform
junit-platform-launcher
- 1.10.0
+ null
test
@@ -141,18 +152,18 @@ all modules and does not describe the project structure per-subproject.
com.google.errorprone
error_prone_annotations
- 2.23.0
+ 2.36.0
provided
com.google.errorprone
error_prone_core
- 2.23.0
+ 2.36.0
com.google.errorprone
error_prone_type_annotations
- 2.23.0
+ 2.36.0
provided
@@ -163,7 +174,7 @@ all modules and does not describe the project structure per-subproject.
com.google.protobuf
protobuf-gradle-plugin
- 0.9.4
+ 0.9.5
provided
@@ -174,12 +185,17 @@ all modules and does not describe the project structure per-subproject.
io.gitlab.arturbosch.detekt
detekt-cli
- 1.23.0
+ 1.23.8
+
+
+ net.sourceforge.pmd
+ pmd-ant
+ 7.12.0
net.sourceforge.pmd
pmd-java
- 6.55.0
+ 7.12.0
org.checkerframework
@@ -190,28 +206,33 @@ all modules and does not describe the project structure per-subproject.
org.jacoco
org.jacoco.agent
- 0.8.12
+ 0.8.13
org.jacoco
org.jacoco.ant
- 0.8.12
+ 0.8.13
+
+
+ org.jetbrains.kotlin
+ kotlin-build-tools-impl
+ 2.1.20
org.jetbrains.kotlin
kotlin-compiler-embeddable
- 1.8.22
+ 2.1.20
org.jetbrains.kotlin
kotlin-klib-commonizer-embeddable
- 1.8.22
+ 2.1.20
org.jetbrains.kotlin
kotlin-scripting-compiler-embeddable
- 1.8.22
+ 2.1.20
-
+
\ No newline at end of file
diff --git a/version.gradle.kts b/version.gradle.kts
index a02d4b6..34a9685 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("0.9.1")
+val versionToPublish: String by extra("0.10.0")