diff --git a/base/build.gradle.kts b/base/build.gradle.kts index ed869b7644..04febd97b4 100644 --- a/base/build.gradle.kts +++ b/base/build.gradle.kts @@ -24,6 +24,7 @@ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +import com.google.protobuf.gradle.GenerateProtoTask import io.spine.dependency.build.JSpecify import io.spine.dependency.lib.AutoService import io.spine.dependency.lib.AutoServiceKsp @@ -37,10 +38,11 @@ import io.spine.dependency.local.TestLib import io.spine.gradle.publish.IncrementGuard import io.spine.gradle.publish.excludeGoogleProtoFromArtifacts -// Apply some plugins to make type-safe extension accessors available in this script file. plugins { module - `compile-protobuf` + id("com.google.protobuf") + id("io.spine.descriptor-set-file") + id("io.spine.generated-sources") `project-report` ksp } @@ -87,3 +89,63 @@ configurations.all { tasks { excludeGoogleProtoFromArtifacts() } + + +// For generating test fixtures. See `src/test/proto`. +protobuf { + configurations.excludeProtobufLite() + + protoc { + artifact = Protobuf.compiler + } + + generateProtoTasks.all().configureEach { + // Delete files generated in `com.google` packages because + // we add `protobuf(Protobuf.protoSrcLib)` dependency above. + doLast { + deleteComGoogle("java") + deleteComGoogle("kotlin") + } + } +} + +/** + * Remove the code generated for Google Protobuf library types. + * + * The code for the `com.google` package was generated because we wanted + * to have descriptors for all the types, including those from Google Protobuf library. + * We want all the descriptors so that they are included into the resources used by + * the `io.spine.type.KnownTypes` class. + * + * Now, as we have the descriptors _and_ duplicating Java or Kotlin code, we delete it to avoid + * classes that duplicate those coming from Protobuf library JARs. + * + * @param language The programming language, either `"java"` or `"kotlin"`. + */ +fun GenerateProtoTask.deleteComGoogle(language: String) { + val comDirectory = generatedDir(language).resolve("com") + val googlePackage = comDirectory.resolve("google") + + project.delete(googlePackage) + + // If the `com` directory becomes empty, delete it too. + if (comDirectory.exists() && comDirectory.isDirectory && comDirectory.list()!!.isEmpty()) { + project.delete(comDirectory) + } +} + +/** + * Obtains the path of the `generated` directory under the project root directory. + */ +private val Project.generatedDir + get() = projectDir.resolve("generated").toPath() + +/** + * Obtains the `generated` directory for the source set of the task. + * + * If [language] is specified returns the subdirectory for this language. + */ +private fun GenerateProtoTask.generatedDir(language: String = ""): File { + val path = "${project.generatedDir}/${sourceSet.name}/$language" + return File(path) +} diff --git a/build.gradle.kts b/build.gradle.kts index 4ee182a4a0..0a56bdce0b 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -39,6 +39,9 @@ import io.spine.gradle.report.pom.PomGenerator buildscript { standardSpineSdkRepositories() doForceVersions(configurations) + dependencies { + classpath(io.spine.dependency.local.ToolBase.protobufSetupPlugins) + } } plugins { diff --git a/buildSrc/src/main/kotlin/compile-protobuf.gradle.kts b/buildSrc/src/main/kotlin/compile-protobuf.gradle.kts deleted file mode 100644 index 4acbb8664a..0000000000 --- a/buildSrc/src/main/kotlin/compile-protobuf.gradle.kts +++ /dev/null @@ -1,53 +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. - */ - -import io.spine.dependency.lib.Protobuf -import io.spine.gradle.protobuf.setup - -plugins { - id("java-library") - 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/io/spine/dependency/local/ToolBase.kt b/buildSrc/src/main/kotlin/io/spine/dependency/local/ToolBase.kt index f9f77fec2a..ec098020da 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.361" + const val version = "2.0.0-SNAPSHOT.363" const val lib = "$group:tool-base:$version" const val classicCodegen = "$group:classic-codegen:$version" @@ -55,6 +55,8 @@ object ToolBase { const val jvmTools = "$group:jvm-tools:$version" const val jvmToolPlugins = "$group:jvm-tool-all-plugins:$version" + const val protobufSetupPlugins = "$group:protobuf-setup-plugins:$version" + object JavadocFilter { const val group = ToolBase.group const val version = "2.0.0-SNAPSHOT.75" diff --git a/buildSrc/src/main/kotlin/io/spine/gradle/protobuf/ProtoTaskExtensions.kt b/buildSrc/src/main/kotlin/io/spine/gradle/protobuf/ProtoTaskExtensions.kt deleted file mode 100644 index 78d9c58e3c..0000000000 --- a/buildSrc/src/main/kotlin/io/spine/gradle/protobuf/ProtoTaskExtensions.kt +++ /dev/null @@ -1,456 +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("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 -import com.google.protobuf.gradle.ProtobufExtension -import io.spine.gradle.sourceSets -import java.io.File -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 -import org.gradle.kotlin.dsl.get -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.tasks.KotlinCompilationTask -import titleCaseFirstChar - -/** - * Obtains the path of the `generated` directory under the project root directory. - */ -private val Project.generatedDir: Path - get() = projectDir.resolve("generated").toPath() - -/** - * Obtains the `generated` directory for the source set of the task. - * - * If [language] is specified returns the subdirectory for this language. - */ -private fun GenerateProtoTask.generatedDir(language: String = ""): File { - val path = "${project.generatedDir}/${sourceSet.name}/$language" - return File(path) -} - -/** - * Configures a [GenerateProtoTask] for the code which cannot use Spine Model Compiler - * (e.g., Spine Base or Spine Validation modules). - * - * The task configuration consists of the following steps: - * - * 1. Adding `"kotlin"` to the list of involved `protoc` builtins. - * - * 2. Turning on the generation of a descriptor set file for each source set. - * These files are placed under the `build/descriptors` directory. - * - * 3. Removing source code generated for `com.google` package for both Java and Kotlin. - * This is done at the final steps of the code generation. - * - * 4. Making `processResource` tasks depend on corresponding `generateProto` tasks. - * If the source set of the configured task isn't `main`, appropriate infix for - * the task names is used. - * - * The usage of this extension in a module build file would be: - * ``` - * protobuf { - * generateProtoTasks.all().configureEach { - * setup() - * } - * } - * ``` - * Using the same code under `subprojects` in a root build file does not seem to work because - * test descriptor set files are not copied to resources. Performing this configuration from - * a module build script solves the issue. - * - * IMPORTANT: In addition to calling `setup`, a submodule must contain a descriptor set reference - * file (`desc.ref`) files placed under `resources`. The descriptor reference file must contain - * a reference to the descriptor set file generated by the corresponding `GenerateProtoTask`. - * - * For example, for the `test` source set, the reference would be `known_types_test.desc`, and - * for the `main` source set, the reference would be `known_types_main.desc`. - * - * See `io.spine.code.proto.DescriptorReference` and `io.spine.code.proto.FileDescriptors` classes - * under the `base` project for more details. - */ -@Suppress("unused") -fun GenerateProtoTask.setup() { - builtins.maybeCreate("kotlin") - setupDescriptorSetFileCreation() - excludeProtocOutput() - doLast { - copyGeneratedFiles() - } - setupKotlinCompile() - dependOnProcessResourcesTask() - makeDirsForIdeaModule() -} - -/** - * Tell `protoc` to generate descriptor set files under the project build dir. - * - * The name of the descriptor set file to be generated - * is made to be unique via the project's Maven coordinates. - * - * As the last step of this task, writes a `desc.ref` file - * for the contextual source set, pointing to the generated descriptor set file. - * This is needed to allow other Spine libraries to locate and load the generated - * descriptor set files properly. - * - * Such a job is usually performed by Spine McJava plugin; - * however, it is not possible to use this plugin (or its code) - * in this repository due to cyclic dependencies. - */ -@Suppress( - "TooGenericExceptionCaught" /* Handling all file-writing failures in the same way.*/ -) -fun GenerateProtoTask.setupDescriptorSetFileCreation() { - // Tell `protoc` generate a descriptor set file. - // The name of the generated file reflects the Maven coordinates of the project. - val ssn = sourceSet.name - generateDescriptorSet = true - val buildDir = project.layout.buildDirectory.asFile.get().path - val descriptorsDir = "$buildDir/descriptors/${ssn}" - val descriptorName = project.descriptorSetName(sourceSet) - with(descriptorSetOptions) { - path = "$descriptorsDir/$descriptorName" - includeImports = true - includeSourceInfo = true - } - - // Add the `descriptors` directory to the resources so that - // the descriptor set file and the reference file which is created in - // the `doLast` block below are packed together with the class files. - sourceSet.resources.srcDirs(descriptorsDir) - - // Create a `desc.ref` in the same resource folder, - // with the name of the descriptor set file created above. - this.doLast { - val descRefFile = File(descriptorsDir, "desc.ref") - descRefFile.createNewFile() - try { - Files.write(descRefFile.toPath(), setOf(descriptorName), TRUNCATE_EXISTING) - } catch (e: Exception) { - project.logger.error("Error writing `${descRefFile.absolutePath}`.", e) - throw e - } - } -} - -/** - * Returns a name of the descriptor file for the given [sourceSet], - * reflecting the Maven coordinates of Gradle artifact, and the source set - * for which the descriptor set name is to be generated. - * - * The returned value is just a file name and does not contain a file path. - */ -private fun Project.descriptorSetName(sourceSet: SourceSet) = - arrayOf( - group.toString(), - name, - sourceSet.name, - version.toString() - ).joinToString(separator = "_", postfix = ".desc") - -/** - * Copies files from the [outputBaseDir][GenerateProtoTask.outputBaseDir] into - * a subdirectory of [generatedDir][Project.generatedDir] for - * the current [sourceSet][GenerateProtoTask.sourceSet]. - * - * Also removes sources belonging to the `com.google` package in the target directory. - */ -private fun GenerateProtoTask.copyGeneratedFiles() { - project.copy { - from(outputBaseDir) - into(generatedDir()) - } - deleteComGoogle("java") - deleteComGoogle("kotlin") -} - -/** - * Remove the code generated for Google Protobuf library types. - * - * Java code for the `com.google` package was generated because we wanted - * to have descriptors for all the types, including those from Google Protobuf library. - * We want all the descriptors so that they are included into the resources used by - * the `io.spine.type.KnownTypes` class. - * - * Now, as we have the descriptors _and_ excessive Java or Kotlin code, we delete it to avoid - * classes that duplicate those coming from Protobuf library JARs. - */ -private fun GenerateProtoTask.deleteComGoogle(language: String) { - val comDirectory = generatedDir(language).resolve("com") - val googlePackage = comDirectory.resolve("google") - - project.delete(googlePackage) - - // If the `com` directory becomes empty, delete it too. - if (comDirectory.exists() && comDirectory.isDirectory && comDirectory.list()!!.isEmpty()) { - project.delete(comDirectory) - } -} - -/** - * Exclude [GenerateProtoTask.outputBaseDir] from Java source set directories to avoid - * duplicated source code files. - */ -fun GenerateProtoTask.excludeProtocOutput() { - val protocOutputDir = File(outputBaseDir).parentFile - - /** - * Filter out directories belonging to `build/generated/source/proto`. - */ - fun filterFor(directorySet: SourceDirectorySet) { - val newSourceDirectories = directorySet.sourceDirectories - .filter { !it.residesIn(protocOutputDir) } - .toSet() - // Make sure we start from scratch. - // Not doing this failed the following, real, assignment sometimes. - directorySet.setSrcDirs(listOf()) - directorySet.srcDirs(newSourceDirectories) - } - - val java: SourceDirectorySet = sourceSet.java - filterFor(java) - // Add copied files to the Java source set. - java.srcDir(generatedDir("java")) - - val kotlin = sourceSet.kotlin - filterFor(kotlin) - // Add copied files to the Kotlin source set. - kotlin.srcDir(generatedDir("kotlin")) -} - -private val SourceSet.kotlin: SourceDirectorySet get() = - (this as org.gradle.api.plugins.ExtensionAware).extensions.getByName("kotlin") - as SourceDirectorySet - -/** - * Make sure Kotlin compilation explicitly depends on this `GenerateProtoTask` to avoid racing. - */ -fun GenerateProtoTask.setupKotlinCompile() { - val kotlinCompile = project.kotlinCompilationTaskFor(sourceSet) - kotlinCompile?.dependsOn(this) -} - -/** - * Make the tasks `processResources` depend on `generateProto` tasks explicitly so that: - * 1) Descriptor set files get into resources, avoiding the racing conditions - * during the build. - * - * 2) We don't have the warning "Execution optimizations have been disabled..." issued - * by Gradle during the build because Protobuf Gradle Plugin does not set - * dependencies between `generateProto` and `processResources` tasks. - */ -fun GenerateProtoTask.dependOnProcessResourcesTask() { - val processResources = processResourceTaskName(sourceSet.name) - project.tasks[processResources].dependsOn(this) -} - -/** - * Obtains the name of the `processResource` task for the given source set name. - */ -private fun processResourceTaskName(sourceSetName: String): String { - val infix = - if (sourceSetName == "main") "" - else sourceSetName.titleCaseFirstChar() - return "process${infix}Resources" -} - -private fun Project.kotlinCompilationTaskFor(sourceSet: SourceSet): KotlinCompilationTask<*>? { - val taskName = sourceSet.getCompileTaskName("Kotlin") - return tasks.named(taskName, KotlinCompilationTask::class.java).orNull -} - -private fun File.residesIn(directory: File): Boolean = - canonicalFile.startsWith(directory.absolutePath) - -/** - * Ensures that generated directories for Java and Kotlin are created before [GenerateIdeaModule]. - * - * This works as advised by `Utils.groovy` from Protobuf Gradle plugin: - * ``` - * This is required because the IntelliJ IDEA plugin does not allow adding source directories - * that do not exist. The IntelliJ IDEA config files should be valid from the start even if - * a user runs './gradlew idea' before running './gradlew generateProto'. - * ``` - */ -fun GenerateProtoTask.makeDirsForIdeaModule() { - project.plugins.withId("idea") { - val javaDir = generatedDir("java") - val kotlinDir = generatedDir("kotlin") - project.tasks.withType(GenerateIdeaModule::class.java).forEach { - it.doFirst { - javaDir.mkdirs() - kotlinDir.mkdirs() - } - } - } -} - -/** - * Prints diagnostic output of `sourceDirs` and `generatedSourceDirs` of an [IdeaModule]. - * - * To get a handle on [IdeaModule] please use the following code: - * - * ```kotlin - * val module = project.extensions.findByType(IdeaModel::class.java)!!.module - * ``` - */ -@Suppress("unused") // To be used when debugging build scripts. -fun IdeaModule.printSourceDirectories() { - println("**** [IDEA] Source directories:") - sourceDirs.forEach { println(it) } - println() - println("**** [IDEA] Generated source directories:") - generatedSourceDirs.forEach { println(it) } - println() - println("**** [IDEA] Excluded directories:") - 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` 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` (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() { - 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 - * are not included in the IDEA project. - * - * IDEA should only see the sources generated by ProtoData as - * we define in [GenerateProtoTask.excludeProtocOutput]. - */ -@Suppress("unused") -fun Project.configureIdea() { - - fun filterSources(sources: Set, excludeDir: File): Set = - sources.filter { !it.residesIn(excludeDir) }.toSet() - - pluginManager.withPlugin("idea") { - val idea = extensions.getByType() - with(idea.module) { - val protocOutput = file(generatedSourceProtoDir) - val protocTargets = protocTargets() - excludeWithNested(protocOutput.toPath(), protocTargets) - sourceDirs = filterSources(sourceDirs, protocOutput) - testSources.filter { !it.residesIn(protocOutput) } - generatedSourceDirs = generatedDir.resolve(protocTargets) - .map { it.toFile() } - .toSet() - } - } -} - -/** - * Lists target directories for Protobuf code generation. - * - * The directory names are in the following format: - * - * `/` - */ -private fun Project.protocTargets(): List { - val protobufTasks = tasks.withType(GenerateProtoTask::class.java) - val codegenTargets = sequence { - protobufTasks.forEach { task -> - val sourceSet = task.sourceSet.name - val builtins = task.builtins.map { builtin -> builtin.name } - val plugins = task.plugins.map { plugin -> plugin.name } - val combined = builtins + plugins - combined.forEach { subdir -> - yield(Paths.get(sourceSet, subdir)) - } - } - } - return codegenTargets.toList() -} - -private fun Path.resolve(subdirs: Iterable): List = - subdirs.map { - resolve(it) - } - -/** - * Excludes the given directory and its subdirectories from - * being seen as ones with the source code. - * - * The primary use of this extension is to exclude `build/generated/source/proto` and its - * subdirectories to avoid duplication of types in the generated code with those in - * produced by ProtoData under the `$projectDir/generated/` directory. - */ -private fun IdeaModule.excludeWithNested(directory: Path, subdirs: Iterable) { - excludeDirs.add(directory.toFile()) - directory.resolve(subdirs).forEach { - excludeDirs.add(it.toFile()) - } -} - -@Suppress("unused") // To be used when debugging build scripts. -private fun printExcluded(dir: Any) { - println(" [IDEA] Excluding directory: $dir") -} diff --git a/dependencies.md b/dependencies.md index b58d621037..36c7f0d970 100644 --- a/dependencies.md +++ b/dependencies.md @@ -1,6 +1,6 @@ -# Dependencies of `io.spine:spine-annotations:2.0.0-SNAPSHOT.363` +# Dependencies of `io.spine:spine-annotations:2.0.0-SNAPSHOT.364` ## Runtime 1. **Group** : org.jetbrains. **Name** : annotations. **Version** : 26.0.2. @@ -798,14 +798,14 @@ The dependencies distributed under several licenses, are used according their commercial-use-friendly license. -This report was generated on **Wed Oct 15 00:14:26 WEST 2025** using +This report was generated on **Sat Oct 18 00:54:03 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:spine-base:2.0.0-SNAPSHOT.363` +# Dependencies of `io.spine:spine-base:2.0.0-SNAPSHOT.364` ## Runtime 1. **Group** : com.google.code.findbugs. **Name** : jsr305. **Version** : 3.0.2. @@ -1724,14 +1724,14 @@ This report was generated on **Wed Oct 15 00:14:26 WEST 2025** using The dependencies distributed under several licenses, are used according their commercial-use-friendly license. -This report was generated on **Wed Oct 15 00:14:26 WEST 2025** using +This report was generated on **Sat Oct 18 00:54:03 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:spine-format:2.0.0-SNAPSHOT.363` +# Dependencies of `io.spine:spine-format:2.0.0-SNAPSHOT.364` ## Runtime 1. **Group** : com.fasterxml.jackson. **Name** : jackson-bom. **Version** : 2.20.0. @@ -2684,6 +2684,6 @@ This report was generated on **Wed Oct 15 00:14:26 WEST 2025** using The dependencies distributed under several licenses, are used according their commercial-use-friendly license. -This report was generated on **Wed Oct 15 00:14:27 WEST 2025** using +This report was generated on **Sat Oct 18 00:54:04 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/pom.xml b/pom.xml index bf23aa107a..a5b335b320 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ all modules and does not describe the project structure per-subproject. --> io.spine base-libraries -2.0.0-SNAPSHOT.363 +2.0.0-SNAPSHOT.364 2015 diff --git a/version.gradle.kts b/version.gradle.kts index c218f7b508..a241b6271c 100644 --- a/version.gradle.kts +++ b/version.gradle.kts @@ -24,4 +24,4 @@ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -val versionToPublish: String by extra("2.0.0-SNAPSHOT.363") +val versionToPublish: String by extra("2.0.0-SNAPSHOT.364")