From acfd72061f81e98db08b3bdaa9add3feac28a87b Mon Sep 17 00:00:00 2001 From: Alexander Yevsyukov Date: Tue, 24 Jun 2025 18:01:32 +0100 Subject: [PATCH 01/24] Update `config` --- .github/workflows/build-on-ubuntu.yml | 2 +- .github/workflows/build-on-windows.yml | 2 +- .../workflows/gradle-wrapper-validation.yml | 4 +- .github/workflows/increment-guard.yml | 2 +- .github/workflows/publish.yml | 2 +- .idea/codeStyles/Project.xml | 3 +- .idea/dictionaries/common.xml | 4 +- .idea/inspectionProfiles/Project_Default.xml | 26 +- .idea/kotlinc.xml | 8 +- .idea/misc.xml | 2 +- build.gradle.kts | 17 +- buildSrc/build.gradle.kts | 62 ++- buildSrc/settings.gradle.kts | 37 ++ buildSrc/src/main/kotlin/BuildExtensions.kt | 128 ++++-- buildSrc/src/main/kotlin/BuildSettings.kt | 9 +- .../src/main/kotlin/DependencyResolution.kt | 36 +- .../src/main/kotlin/DocumentationSettings.kt | 58 +++ buildSrc/src/main/kotlin/DokkaExts.kt | 91 +++-- buildSrc/src/main/kotlin/LicenseSettings.kt | 43 ++ buildSrc/src/main/kotlin/Strings.kt | 19 +- .../main/kotlin/compile-protobuf.gradle.kts | 12 +- .../src/main/kotlin/config-tester.gradle.kts | 2 +- .../kotlin/detekt-code-analysis.gradle.kts | 2 +- .../src/main/kotlin/dokka-for-java.gradle.kts | 18 +- .../main/kotlin/dokka-for-kotlin.gradle.kts | 18 +- .../kotlin/io/spine/dependency/Dependency.kt | 116 ++++++ .../kotlin/io/spine/dependency/boms/Boms.kt | 66 ++++ .../io/spine/dependency/boms/BomsPlugin.kt | 185 +++++++++ .../spine/dependency/build/AnimalSniffer.kt | 2 +- .../io/spine/dependency/build/CheckStyle.kt | 2 +- .../dependency/build/CheckerFramework.kt | 2 +- .../kotlin/io/spine/dependency/build/Dokka.kt | 6 +- .../io/spine/dependency/build/ErrorProne.kt | 21 +- .../io/spine/dependency/build/FindBugs.kt | 2 +- .../io/spine/dependency/build/GradleDoctor.kt | 2 +- .../io/spine/dependency/build/JSpecify.kt | 40 ++ .../kotlin/io/spine/dependency/build/Ksp.kt | 28 +- .../spine/dependency/build/LicenseReport.kt | 2 +- .../io/spine/dependency/build/OsDetector.kt | 2 +- .../dependency/build/PluginPublishPlugin.kt | 42 ++ .../kotlin/io/spine/dependency/build/Pmd.kt | 11 +- .../io/spine/dependency/kotlinx/Coroutines.kt | 54 +++ .../io/spine/dependency/kotlinx/KotlinX.kt | 32 ++ .../spine/dependency/kotlinx/Serialization.kt | 73 ++++ .../kotlin/io/spine/dependency/lib/Aedile.kt | 6 +- .../io/spine/dependency/lib/ApacheHttp.kt | 2 +- .../io/spine/dependency/lib/AppEngine.kt | 2 +- .../kotlin/io/spine/dependency/lib/Asm.kt | 13 +- .../kotlin/io/spine/dependency/lib/Auto.kt | 9 +- .../io/spine/dependency/lib/BouncyCastle.kt | 2 +- .../io/spine/dependency/lib/Caffeine.kt | 8 +- .../kotlin/io/spine/dependency/lib/Clikt.kt | 2 +- .../io/spine/dependency/lib/CommonsCli.kt | 2 +- .../io/spine/dependency/lib/CommonsCodec.kt | 2 +- .../io/spine/dependency/lib/CommonsLogging.kt | 2 +- .../io/spine/dependency/lib/Coroutines.kt | 27 +- .../io/spine/dependency/lib/Firebase.kt | 2 +- .../kotlin/io/spine/dependency/lib/Flogger.kt | 2 +- .../io/spine/dependency/lib/GoogleApis.kt | 2 +- .../io/spine/dependency/lib/GoogleCloud.kt | 2 +- .../kotlin/io/spine/dependency/lib/Grpc.kt | 67 +++- .../io/spine/dependency/lib/GrpcKotlin.kt | 5 +- .../kotlin/io/spine/dependency/lib/Gson.kt | 4 +- .../kotlin/io/spine/dependency/lib/Guava.kt | 9 +- .../io/spine/dependency/lib/HttpClient.kt | 2 +- .../io/spine/dependency/lib/IntelliJ.kt | 2 +- .../kotlin/io/spine/dependency/lib/J2ObjC.kt | 2 +- .../kotlin/io/spine/dependency/lib/Jackson.kt | 110 ++++-- .../io/spine/dependency/lib/JavaDiffUtils.kt | 2 +- .../kotlin/io/spine/dependency/lib/JavaJwt.kt | 2 +- .../io/spine/dependency/lib/JavaPoet.kt | 7 +- .../kotlin/io/spine/dependency/lib/JavaX.kt | 7 +- .../kotlin/io/spine/dependency/lib/Klaxon.kt | 2 +- .../kotlin/io/spine/dependency/lib/Kotlin.kt | 88 ++++- .../io/spine/dependency/lib/KotlinPoet.kt | 35 ++ .../io/spine/dependency/lib/KotlinSemver.kt | 4 +- .../kotlin/io/spine/dependency/lib/KotlinX.kt | 27 +- .../kotlin/io/spine/dependency/lib/Log4j2.kt | 4 +- .../kotlin/io/spine/dependency/lib/Netty.kt | 2 +- .../kotlin/io/spine/dependency/lib/Okio.kt | 2 +- .../kotlin/io/spine/dependency/lib/Plexus.kt | 2 +- .../io/spine/dependency/lib/Protobuf.kt | 10 +- .../kotlin/io/spine/dependency/lib/Roaster.kt | 9 +- .../kotlin/io/spine/dependency/lib/Slf4J.kt | 2 +- .../spine/dependency/local/ArtifactVersion.kt | 40 +- .../kotlin/io/spine/dependency/local/Base.kt | 43 ++ .../io/spine/dependency/local/BaseTypes.kt | 40 ++ .../io/spine/dependency/local/Change.kt | 40 ++ .../io/spine/dependency/local/CoreJava.kt | 16 +- .../io/spine/dependency/local/Logging.kt | 13 +- .../io/spine/dependency/local/McJava.kt | 6 +- .../spine/dependency/local/ModelCompiler.kt | 40 ++ .../io/spine/dependency/local/ProtoData.kt | 14 +- .../io/spine/dependency/local/ProtoTap.kt | 4 +- .../io/spine/dependency/local/Reflect.kt | 40 ++ .../kotlin/io/spine/dependency/local/Spine.kt | 77 +++- .../kotlin/io/spine/dependency/local/Time.kt | 42 ++ .../io/spine/dependency/local/ToolBase.kt | 23 +- .../io/spine/dependency/local/Validation.kt | 13 +- .../io/spine/dependency/test/AssertK.kt | 4 +- .../io/spine/dependency/test/Hamcrest.kt | 4 +- .../kotlin/io/spine/dependency/test/JUnit.kt | 87 +++- .../kotlin/io/spine/dependency/test/Jacoco.kt | 4 +- .../kotlin/io/spine/dependency/test/Kotest.kt | 4 +- .../dependency/test/KotlinCompileTesting.kt | 40 ++ .../kotlin/io/spine/dependency/test/Kover.kt | 4 +- .../io/spine/dependency/test/OpenTest4J.kt | 2 +- .../io/spine/dependency/test/SystemLambda.kt | 2 +- .../io/spine/dependency/test/TestKitTruth.kt | 2 +- .../kotlin/io/spine/dependency/test/Truth.kt | 4 +- .../kotlin/io/spine/docs/MarkdownDocument.kt | 2 +- .../src/main/kotlin/io/spine/gradle/Build.kt | 2 +- .../src/main/kotlin/io/spine/gradle/Clean.kt | 2 +- .../kotlin/io/spine/gradle/ConfigTester.kt | 2 +- .../io/spine/gradle/ProjectExtensions.kt | 13 +- .../kotlin/io/spine/gradle/Repositories.kt | 370 ------------------ .../main/kotlin/io/spine/gradle/RunBuild.kt | 4 +- .../main/kotlin/io/spine/gradle/RunGradle.kt | 4 +- .../main/kotlin/io/spine/gradle/Runtime.kt | 2 +- .../io/spine/gradle/StringExtensions.kt | 2 +- .../main/kotlin/io/spine/gradle/TaskName.kt | 2 +- .../kotlin/io/spine/gradle/VersionWriter.kt | 2 +- .../main/kotlin/io/spine/gradle/base/Tasks.kt | 2 +- .../gradle/checkstyle/CheckStyleConfig.kt | 13 +- .../io/spine/gradle/dart/DartContext.kt | 2 +- .../io/spine/gradle/dart/DartEnvironment.kt | 2 +- .../io/spine/gradle/dart/DartExtension.kt | 2 +- .../spine/gradle/dart/plugin/DartPlugins.kt | 2 +- .../io/spine/gradle/dart/plugin/Protobuf.kt | 2 +- .../kotlin/io/spine/gradle/dart/task/Build.kt | 2 +- .../io/spine/gradle/dart/task/DartTasks.kt | 2 +- .../spine/gradle/dart/task/IntegrationTest.kt | 2 +- .../io/spine/gradle/dart/task/Publish.kt | 2 +- .../io/spine/gradle/dokka/DokkaExtensions.kt | 2 +- .../gradle/dokka/TaskContainerExtensions.kt | 2 +- .../kotlin/io/spine/gradle/fs/LazyTempPath.kt | 2 +- .../main/kotlin/io/spine/gradle/git/Branch.kt | 2 +- .../kotlin/io/spine/gradle/git/Repository.kt | 2 +- .../kotlin/io/spine/gradle/git/UserInfo.kt | 2 +- .../spine/gradle/github/pages/AuthorEmail.kt | 2 +- .../github/pages/RepositoryExtensions.kt | 4 +- .../io/spine/gradle/github/pages/SshKey.kt | 2 +- .../io/spine/gradle/github/pages/TaskName.kt | 2 +- .../io/spine/gradle/github/pages/Update.kt | 2 +- .../gradle/github/pages/UpdateGitHubPages.kt | 2 +- .../pages/UpdateGitHubPagesExtension.kt | 2 +- .../main/kotlin/io/spine/gradle/java/Tasks.kt | 2 +- .../io/spine/gradle/javac/ErrorProne.kt | 3 +- .../kotlin/io/spine/gradle/javac/Javac.kt | 2 +- .../io/spine/gradle/javadoc/Encoding.kt | 2 +- .../gradle/javadoc/ExcludeInternalDoclet.kt | 2 +- .../io/spine/gradle/javadoc/JavadocConfig.kt | 33 +- .../io/spine/gradle/javadoc/JavadocTag.kt | 2 +- .../io/spine/gradle/javascript/JsContext.kt | 7 +- .../spine/gradle/javascript/JsEnvironment.kt | 2 +- .../io/spine/gradle/javascript/JsExtension.kt | 2 +- .../io/spine/gradle/javascript/plugin/Idea.kt | 2 +- .../gradle/javascript/plugin/JsPlugins.kt | 2 +- .../io/spine/gradle/javascript/plugin/McJs.kt | 2 +- .../gradle/javascript/plugin/Protobuf.kt | 4 +- .../spine/gradle/javascript/task/Assemble.kt | 2 +- .../io/spine/gradle/javascript/task/Check.kt | 2 +- .../io/spine/gradle/javascript/task/Clean.kt | 2 +- .../gradle/javascript/task/IntegrationTest.kt | 2 +- .../spine/gradle/javascript/task/JsTasks.kt | 2 +- .../gradle/javascript/task/LicenseReport.kt | 2 +- .../spine/gradle/javascript/task/Publish.kt | 2 +- .../spine/gradle/javascript/task/Webpack.kt | 2 +- .../io/spine/gradle/kotlin/KotlinConfig.kt | 23 +- .../gradle/protobuf/ProtoTaskExtensions.kt | 262 +++++++++---- .../gradle/publish/CheckVersionIncrement.kt | 35 +- .../gradle/publish/CloudArtifactRegistry.kt | 12 +- .../io/spine/gradle/publish/CloudRepo.kt | 7 +- .../publish/CustomPublicationHandler.kt | 70 ++++ .../io/spine/gradle/publish/GitHubPackages.kt | 16 +- .../io/spine/gradle/publish/IncrementGuard.kt | 2 +- .../kotlin/io/spine/gradle/publish/JarDsl.kt | 2 +- .../io/spine/gradle/publish/ProtoExts.kt | 2 +- .../gradle/publish/PublicationHandler.kt | 250 ++++++++++++ .../io/spine/gradle/publish/Publications.kt | 234 ----------- .../io/spine/gradle/publish/PublishingExts.kt | 75 +++- .../spine/gradle/publish/PublishingRepos.kt | 4 +- .../io/spine/gradle/publish/ShadowJarExts.kt | 77 ++++ .../spine/gradle/publish/SpinePublishing.kt | 237 +++++++---- .../publish/StandardJavaPublicationHandler.kt | 133 +++++++ .../io/spine/gradle/repo/Credentials.kt | 35 ++ .../io/spine/gradle/{ => repo}/RepoSlug.kt | 7 +- .../io/spine/gradle/repo/Repositories.kt | 172 ++++++++ .../kotlin/io/spine/gradle/repo/Repository.kt | 138 +++++++ .../gradle/report/coverage/CodebaseFilter.kt | 3 +- .../gradle/report/coverage/FileExtension.kt | 2 +- .../gradle/report/coverage/FileExtensions.kt | 2 +- .../gradle/report/coverage/FileFilter.kt | 2 +- .../gradle/report/coverage/JacocoConfig.kt | 8 +- .../gradle/report/coverage/PathMarker.kt | 2 +- .../spine/gradle/report/coverage/TaskName.kt | 2 +- .../gradle/report/license/Configuration.kt | 2 +- .../gradle/report/license/LicenseReporter.kt | 12 +- .../report/license/MarkdownReportRenderer.kt | 2 +- .../report/license/ModuleDataExtensions.kt | 2 +- .../io/spine/gradle/report/license/Paths.kt | 2 +- .../report/license/ProjectDependencies.kt | 2 +- .../io/spine/gradle/report/license/Tasks.kt | 2 +- .../spine/gradle/report/license/Template.kt | 2 +- .../gradle/report/pom/DependencyScope.kt | 2 +- .../gradle/report/pom/DependencyWriter.kt | 6 +- .../spine/gradle/report/pom/InceptionYear.kt | 2 +- .../gradle/report/pom/MarkupExtensions.kt | 2 +- .../gradle/report/pom/ModuleDependency.kt | 6 +- .../spine/gradle/report/pom/PomFormatting.kt | 2 +- .../spine/gradle/report/pom/PomGenerator.kt | 30 +- .../spine/gradle/report/pom/PomXmlWriter.kt | 2 +- .../gradle/report/pom/ProjectMetadata.kt | 2 +- .../gradle/report/pom/ScopedDependency.kt | 2 +- .../spine/gradle/report/pom/SpineLicense.kt | 2 +- .../kotlin/io/spine/gradle/testing/Logging.kt | 2 +- .../io/spine/gradle/testing/Multiproject.kt | 2 +- .../kotlin/io/spine/gradle/testing/Tasks.kt | 9 +- .../src/main/kotlin/jacoco-kmm-jvm.gradle.kts | 72 ++++ .../main/kotlin/jacoco-kotlin-jvm.gradle.kts | 2 +- .../src/main/kotlin/jvm-module.gradle.kts | 88 ++--- .../src/main/kotlin/kmp-module.gradle.kts | 16 +- .../src/main/kotlin/module-testing.gradle.kts | 121 ++++++ .../src/main/kotlin/pmd-settings.gradle.kts | 2 +- .../main/kotlin/uber-jar-module.gradle.kts | 202 ++++++++++ .../src/main/kotlin/write-manifest.gradle.kts | 4 +- config | 2 +- dependencies.md | 34 +- gradle.properties | 15 + gradle/wrapper/gradle-wrapper.jar | Bin 43453 -> 43764 bytes gradle/wrapper/gradle-wrapper.properties | 2 +- gradlew | 12 +- gradlew.bat | 6 +- logging/build.gradle.kts | 7 +- .../jvm-default-platform/build.gradle.kts | 2 +- pom.xml | 28 +- 236 files changed, 3940 insertions(+), 1531 deletions(-) create mode 100644 buildSrc/settings.gradle.kts create mode 100644 buildSrc/src/main/kotlin/DocumentationSettings.kt create mode 100644 buildSrc/src/main/kotlin/LicenseSettings.kt create mode 100644 buildSrc/src/main/kotlin/io/spine/dependency/Dependency.kt create mode 100644 buildSrc/src/main/kotlin/io/spine/dependency/boms/Boms.kt create mode 100644 buildSrc/src/main/kotlin/io/spine/dependency/boms/BomsPlugin.kt create mode 100644 buildSrc/src/main/kotlin/io/spine/dependency/build/JSpecify.kt create mode 100644 buildSrc/src/main/kotlin/io/spine/dependency/build/PluginPublishPlugin.kt create mode 100644 buildSrc/src/main/kotlin/io/spine/dependency/kotlinx/Coroutines.kt create mode 100644 buildSrc/src/main/kotlin/io/spine/dependency/kotlinx/KotlinX.kt create mode 100644 buildSrc/src/main/kotlin/io/spine/dependency/kotlinx/Serialization.kt create mode 100644 buildSrc/src/main/kotlin/io/spine/dependency/lib/KotlinPoet.kt create mode 100644 buildSrc/src/main/kotlin/io/spine/dependency/local/Base.kt create mode 100644 buildSrc/src/main/kotlin/io/spine/dependency/local/BaseTypes.kt create mode 100644 buildSrc/src/main/kotlin/io/spine/dependency/local/Change.kt create mode 100644 buildSrc/src/main/kotlin/io/spine/dependency/local/ModelCompiler.kt create mode 100644 buildSrc/src/main/kotlin/io/spine/dependency/local/Reflect.kt create mode 100644 buildSrc/src/main/kotlin/io/spine/dependency/local/Time.kt create mode 100644 buildSrc/src/main/kotlin/io/spine/dependency/test/KotlinCompileTesting.kt delete mode 100644 buildSrc/src/main/kotlin/io/spine/gradle/Repositories.kt create mode 100644 buildSrc/src/main/kotlin/io/spine/gradle/publish/CustomPublicationHandler.kt create mode 100644 buildSrc/src/main/kotlin/io/spine/gradle/publish/PublicationHandler.kt delete mode 100644 buildSrc/src/main/kotlin/io/spine/gradle/publish/Publications.kt create mode 100644 buildSrc/src/main/kotlin/io/spine/gradle/publish/ShadowJarExts.kt create mode 100644 buildSrc/src/main/kotlin/io/spine/gradle/publish/StandardJavaPublicationHandler.kt create mode 100644 buildSrc/src/main/kotlin/io/spine/gradle/repo/Credentials.kt rename buildSrc/src/main/kotlin/io/spine/gradle/{ => repo}/RepoSlug.kt (92%) create mode 100644 buildSrc/src/main/kotlin/io/spine/gradle/repo/Repositories.kt create mode 100644 buildSrc/src/main/kotlin/io/spine/gradle/repo/Repository.kt create mode 100644 buildSrc/src/main/kotlin/jacoco-kmm-jvm.gradle.kts create mode 100644 buildSrc/src/main/kotlin/module-testing.gradle.kts create mode 100644 buildSrc/src/main/kotlin/uber-jar-module.gradle.kts diff --git a/.github/workflows/build-on-ubuntu.yml b/.github/workflows/build-on-ubuntu.yml index 028e58357..f8c24933f 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 3627bbff8..4e6b57f1f 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 a13b19119..858cebbcc 100644 --- a/.github/workflows/gradle-wrapper-validation.yml +++ b/.github/workflows/gradle-wrapper-validation.yml @@ -9,11 +9,11 @@ on: jobs: validation: - name: Validation + name: Gradle Wrapper Validation runs-on: ubuntu-latest steps: - name: Checkout latest code uses: actions/checkout@v4 - name: Validate Gradle Wrapper - uses: gradle/wrapper-validation-action@v1 + uses: gradle/actions/wrapper-validation@v4 diff --git a/.github/workflows/increment-guard.yml b/.github/workflows/increment-guard.yml index a1c90c312..1993841a6 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 73a0a69f2..8b5b4d55c 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/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml index 809943cce..f60c2734a 100644 --- a/.idea/codeStyles/Project.xml +++ b/.idea/codeStyles/Project.xml @@ -1,5 +1,6 @@ + - + \ No newline at end of file diff --git a/.idea/dictionaries/common.xml b/.idea/dictionaries/common.xml index e62952a2b..d1c3a7bfe 100644 --- a/.idea/dictionaries/common.xml +++ b/.idea/dictionaries/common.xml @@ -24,6 +24,8 @@ handshaker hohpe idempotency + jspecify + kotest lempira liskov melnik @@ -66,4 +68,4 @@ yevsyukov - + \ No newline at end of file diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml index 35bbdff59..229f1d344 100644 --- a/.idea/inspectionProfiles/Project_Default.xml +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -146,13 +146,11 @@ - - @@ -194,7 +192,6 @@ - @@ -258,6 +255,18 @@ + + + + + + - @@ -623,6 +631,9 @@ + + + @@ -690,7 +701,6 @@ - @@ -711,7 +721,6 @@ - - + diff --git a/build.gradle.kts b/build.gradle.kts index 7ad80c9df..df40afc15 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -25,20 +25,21 @@ */ import io.spine.dependency.build.Dokka -import io.spine.dependency.test.JUnit import io.spine.dependency.lib.Jackson +import io.spine.dependency.local.Base import io.spine.dependency.local.Logging -import io.spine.dependency.local.Spine import io.spine.dependency.local.ToolBase import io.spine.dependency.local.Validation +import io.spine.dependency.test.JUnit import io.spine.gradle.publish.PublishingRepos import io.spine.gradle.publish.spinePublishing +import io.spine.gradle.repo.standardToSpineSdk 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 plugins { + id("org.jetbrains.dokka") idea jacoco `gradle-doctor` @@ -80,13 +81,13 @@ allprojects { exclude("io.spine:spine-validate") resolutionStrategy { force( - Spine.base, + Base.lib, ToolBase.lib, Logging.lib, Validation.runtime, Dokka.BasePlugin.lib, Jackson.databind, - JUnit.runner, + JUnit.Jupiter.engine, ) } } @@ -98,3 +99,9 @@ gradle.projectsEvaluated { LicenseReporter.mergeAllReports(project) PomGenerator.applyTo(project) } + +dependencies { + productionModules.forEach { + dokka(it) + } +} diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts index b2de37a9e..b41bfb40f 100644 --- a/buildSrc/build.gradle.kts +++ b/buildSrc/build.gradle.kts @@ -1,5 +1,5 @@ /* - * 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. @@ -37,9 +37,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 { @@ -54,7 +51,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`. @@ -71,12 +68,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.9.22" +val kotlinEmbeddedVersion = "2.1.21" /** * The version of Guava used in `buildSrc`. @@ -84,7 +81,7 @@ val kotlinVersion = "1.9.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. @@ -94,7 +91,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. @@ -104,7 +101,7 @@ val errorPronePluginVersion = "3.1.0" * @see * Protobuf Gradle Plugins Releases */ -val protobufPluginVersion = "0.9.4" +val protobufPluginVersion = "0.9.5" /** * The version of Dokka Gradle Plugins. @@ -114,19 +111,19 @@ 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] */ -val kotestJvmPluginVersion = "0.4.11" +val kotestJvmPluginVersion = "0.4.10" /** * @see [io.spine.dependency.test.Kotest.MultiplatformGradlePlugin] @@ -134,9 +131,9 @@ val kotestJvmPluginVersion = "0.4.11" val kotestMultiplatformPluginVersion = "5.9.1" /** - * @see [io.spine.internal.dependency.Kover] + * @see [io.spine.dependency.test.Kover] */ -val koverVersion = "0.7.2" +val koverVersion = "0.9.1" /** * The version of the Shadow Plugin. @@ -145,7 +142,7 @@ val koverVersion = "0.7.2" * * @see Shadow Plugin releases */ -val shadowVersion = "7.1.2" +val shadowVersion = "8.3.6" configurations.all { resolutionStrategy { @@ -154,27 +151,16 @@ 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) -} - -tasks.withType { - kotlinOptions { - jvmTarget = jvmVersion.toString() - } -} - dependencies { api("com.github.jk1:gradle-license-report:$licenseReportVersion") + api(platform("org.jetbrains.kotlin:kotlin-bom:$kotlinEmbeddedVersion")) dependOnAuthCommon() listOf( @@ -183,18 +169,18 @@ 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}", + "com.gradleup.shadow:shadow-gradle-plugin:$shadowVersion", "io.gitlab.arturbosch.detekt:detekt-gradle-plugin:$detektVersion", "io.kotest:kotest-gradle-plugin:$kotestJvmPluginVersion", "io.kotest:kotest-framework-multiplatform-plugin-gradle:$kotestMultiplatformPluginVersion", // 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}", - "org.jetbrains.dokka:dokka-gradle-plugin:${dokkaVersion}", - "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlinVersion", - "org.jetbrains.kotlin:kotlin-reflect:$kotlinVersion", + "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:$kotlinEmbeddedVersion", + "org.jetbrains.kotlin:kotlin-reflect:$kotlinEmbeddedVersion", "org.jetbrains.kotlinx:kover-gradle-plugin:$koverVersion" ).forEach { implementation(it) diff --git a/buildSrc/settings.gradle.kts b/buildSrc/settings.gradle.kts new file mode 100644 index 000000000..8d820eccb --- /dev/null +++ b/buildSrc/settings.gradle.kts @@ -0,0 +1,37 @@ +/* + * 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. + */ + +pluginManagement { + repositories { + gradlePluginPortal() + mavenLocal() + mavenCentral() + } +} + +plugins { + id("org.gradle.toolchains.foojay-resolver-convention").version("1.0.0") +} diff --git a/buildSrc/src/main/kotlin/BuildExtensions.kt b/buildSrc/src/main/kotlin/BuildExtensions.kt index c455e44b3..4654e3649 100644 --- a/buildSrc/src/main/kotlin/BuildExtensions.kt +++ b/buildSrc/src/main/kotlin/BuildExtensions.kt @@ -1,5 +1,5 @@ /* - * 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. @@ -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,12 +67,18 @@ 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() } +/** + * Shortcut to [Protobuf] dependency object for using under `buildScript`. + */ +val ScriptHandlerScope.protobuf: Protobuf + get() = Protobuf + /** * Shortcut to [McJava] dependency object for using under `buildScript`. */ @@ -99,7 +106,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 +118,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 +157,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 +194,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 +236,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 +276,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 +303,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 +313,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 0e3eb977d..be1da27f2 100644 --- a/buildSrc/src/main/kotlin/BuildSettings.kt +++ b/buildSrc/src/main/kotlin/BuildSettings.kt @@ -1,5 +1,5 @@ /* - * 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. @@ -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 25ae2b431..124adb3f5 100644 --- a/buildSrc/src/main/kotlin/DependencyResolution.kt +++ b/buildSrc/src/main/kotlin/DependencyResolution.kt @@ -1,5 +1,5 @@ /* - * 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. @@ -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,16 +40,15 @@ 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 import io.spine.dependency.lib.Plexus import io.spine.dependency.lib.Protobuf 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 @@ -85,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, @@ -96,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 @@ -110,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, ) @@ -137,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, @@ -186,7 +170,7 @@ fun ModuleDependency.excludeSpineBase() { fun Project.forceSpineBase() { configurations.all { resolutionStrategy { - force(Spine.base) + force(Base.lib) } } } @@ -198,9 +182,9 @@ fun Project.forceSpineBase() { @Suppress("unused") fun Project.forceBaseInProtoTasks() { configurations.configureEach { - if (name.lowercased().contains("proto")) { + if (name.lowercase().contains("proto")) { resolutionStrategy { - force(Spine.baseForBuildScript) + force(Base.libForBuildScript) } } } diff --git a/buildSrc/src/main/kotlin/DocumentationSettings.kt b/buildSrc/src/main/kotlin/DocumentationSettings.kt new file mode 100644 index 000000000..b538faedf --- /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 89cbee645..b141a228a 100644 --- a/buildSrc/src/main/kotlin/DokkaExts.kt +++ b/buildSrc/src/main/kotlin/DokkaExts.kt @@ -1,5 +1,5 @@ /* - * 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. @@ -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 000000000..465129f55 --- /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 9589d39b1..19e0c218b 100644 --- a/buildSrc/src/main/kotlin/Strings.kt +++ b/buildSrc/src/main/kotlin/Strings.kt @@ -1,5 +1,5 @@ /* - * 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. @@ -24,8 +24,6 @@ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -import org.gradle.configurationcache.extensions.capitalized - /** * This file provides extensions to `String` and `CharSequence` that wrap * analogues from standard Kotlin runtime. @@ -43,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 cc08bf091..4acbb8664 100644 --- a/buildSrc/src/main/kotlin/compile-protobuf.gradle.kts +++ b/buildSrc/src/main/kotlin/compile-protobuf.gradle.kts @@ -1,5 +1,5 @@ /* - * 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. @@ -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/config-tester.gradle.kts b/buildSrc/src/main/kotlin/config-tester.gradle.kts index c0cb50462..21d31e363 100644 --- a/buildSrc/src/main/kotlin/config-tester.gradle.kts +++ b/buildSrc/src/main/kotlin/config-tester.gradle.kts @@ -1,5 +1,5 @@ /* - * 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. diff --git a/buildSrc/src/main/kotlin/detekt-code-analysis.gradle.kts b/buildSrc/src/main/kotlin/detekt-code-analysis.gradle.kts index 503114d7a..7b0ffd133 100644 --- a/buildSrc/src/main/kotlin/detekt-code-analysis.gradle.kts +++ b/buildSrc/src/main/kotlin/detekt-code-analysis.gradle.kts @@ -1,5 +1,5 @@ /* - * 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. diff --git a/buildSrc/src/main/kotlin/dokka-for-java.gradle.kts b/buildSrc/src/main/kotlin/dokka-for-java.gradle.kts index 2c10701c5..6bab07915 100644 --- a/buildSrc/src/main/kotlin/dokka-for-java.gradle.kts +++ b/buildSrc/src/main/kotlin/dokka-for-java.gradle.kts @@ -1,5 +1,5 @@ /* - * 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. @@ -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 73da35d8e..c24135e16 100644 --- a/buildSrc/src/main/kotlin/dokka-for-kotlin.gradle.kts +++ b/buildSrc/src/main/kotlin/dokka-for-kotlin.gradle.kts @@ -1,5 +1,5 @@ /* - * 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. @@ -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 000000000..87f1174bd --- /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 000000000..df1751bcd --- /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 000000000..2724dda54 --- /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/AnimalSniffer.kt b/buildSrc/src/main/kotlin/io/spine/dependency/build/AnimalSniffer.kt index 9fe3a8926..825889613 100644 --- a/buildSrc/src/main/kotlin/io/spine/dependency/build/AnimalSniffer.kt +++ b/buildSrc/src/main/kotlin/io/spine/dependency/build/AnimalSniffer.kt @@ -1,5 +1,5 @@ /* - * 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. diff --git a/buildSrc/src/main/kotlin/io/spine/dependency/build/CheckStyle.kt b/buildSrc/src/main/kotlin/io/spine/dependency/build/CheckStyle.kt index ab9a08add..e1e3b2851 100644 --- a/buildSrc/src/main/kotlin/io/spine/dependency/build/CheckStyle.kt +++ b/buildSrc/src/main/kotlin/io/spine/dependency/build/CheckStyle.kt @@ -1,5 +1,5 @@ /* - * 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. diff --git a/buildSrc/src/main/kotlin/io/spine/dependency/build/CheckerFramework.kt b/buildSrc/src/main/kotlin/io/spine/dependency/build/CheckerFramework.kt index dd3f1fb83..5d2140ad5 100644 --- a/buildSrc/src/main/kotlin/io/spine/dependency/build/CheckerFramework.kt +++ b/buildSrc/src/main/kotlin/io/spine/dependency/build/CheckerFramework.kt @@ -1,5 +1,5 @@ /* - * 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. 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 45e73dd40..003bf587f 100644 --- a/buildSrc/src/main/kotlin/io/spine/dependency/build/Dokka.kt +++ b/buildSrc/src/main/kotlin/io/spine/dependency/build/Dokka.kt @@ -1,5 +1,5 @@ /* - * 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. @@ -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.4" + 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 7ce19e043..5b47c1b72 100644 --- a/buildSrc/src/main/kotlin/io/spine/dependency/build/ErrorProne.kt +++ b/buildSrc/src/main/kotlin/io/spine/dependency/build/ErrorProne.kt @@ -1,5 +1,5 @@ /* - * 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. @@ -30,18 +30,21 @@ 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" + // https://github.com/tbroyer/gradle-errorprone-plugin/blob/v0.8/build.gradle.kts private const val javacPluginVersion = "9+181-r4173-1" val annotations = listOf( - "com.google.errorprone:error_prone_annotations:$version", - "com.google.errorprone:error_prone_type_annotations:$version" + "$group:error_prone_annotations:$version", + "$group:error_prone_type_annotations:$version" ) - const val core = "com.google.errorprone:error_prone_core:$version" - const val checkApi = "com.google.errorprone:error_prone_check_api:$version" - const val testHelpers = "com.google.errorprone:error_prone_test_helpers:$version" - const val javacPlugin = "com.google.errorprone:javac:$javacPluginVersion" + const val core = "$group:error_prone_core:$version" + const val checkApi = "$group:error_prone_check_api:$version" + const val testHelpers = "$group:error_prone_test_helpers:$version" + const val javacPlugin = "$group:javac:$javacPluginVersion" // https://github.com/tbroyer/gradle-errorprone-plugin/releases object GradlePlugin { @@ -53,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/FindBugs.kt b/buildSrc/src/main/kotlin/io/spine/dependency/build/FindBugs.kt index ff99a09e0..98003b983 100644 --- a/buildSrc/src/main/kotlin/io/spine/dependency/build/FindBugs.kt +++ b/buildSrc/src/main/kotlin/io/spine/dependency/build/FindBugs.kt @@ -1,5 +1,5 @@ /* - * 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. diff --git a/buildSrc/src/main/kotlin/io/spine/dependency/build/GradleDoctor.kt b/buildSrc/src/main/kotlin/io/spine/dependency/build/GradleDoctor.kt index c1a6bc575..89cfb341b 100644 --- a/buildSrc/src/main/kotlin/io/spine/dependency/build/GradleDoctor.kt +++ b/buildSrc/src/main/kotlin/io/spine/dependency/build/GradleDoctor.kt @@ -1,5 +1,5 @@ /* - * 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. 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 000000000..d884ffbcd --- /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 9b884f277..662a94e33 100644 --- a/buildSrc/src/main/kotlin/io/spine/dependency/build/Ksp.kt +++ b/buildSrc/src/main/kotlin/io/spine/dependency/build/Ksp.kt @@ -1,5 +1,5 @@ /* - * 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. @@ -26,15 +26,31 @@ package io.spine.dependency.build +import io.spine.dependency.Dependency + /** * Kotlin Symbol Processing API. * * @see KSP GitHub repository */ -object Ksp { - /** - * The latest version compatible with Kotlin v1.8.22, which is bundled with Gradle 7.6.4. - */ - const val version = "1.8.22-1.0.11" +@Suppress("unused") +object Ksp : Dependency() { + override val version = "2.1.21-2.0.2" + override val group = "com.google.devtools.ksp" + const val id = "com.google.devtools.ksp" + + val symbolProcessingApi = "$group:symbol-processing-api" + val symbolProcessing = "$group:symbol-processing" + val symbolProcessingAaEmb = "$group:symbol-processing-aa-embeddable" + val symbolProcessingCommonDeps = "$group:symbol-processing-common-deps" + val gradlePlugin = "$group:symbol-processing-gradle-plugin" + + override val modules = listOf( + symbolProcessingApi, + symbolProcessing, + symbolProcessingAaEmb, + symbolProcessingCommonDeps, + gradlePlugin, + ) } diff --git a/buildSrc/src/main/kotlin/io/spine/dependency/build/LicenseReport.kt b/buildSrc/src/main/kotlin/io/spine/dependency/build/LicenseReport.kt index cdbfc0416..a4eb7548e 100644 --- a/buildSrc/src/main/kotlin/io/spine/dependency/build/LicenseReport.kt +++ b/buildSrc/src/main/kotlin/io/spine/dependency/build/LicenseReport.kt @@ -1,5 +1,5 @@ /* - * 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. diff --git a/buildSrc/src/main/kotlin/io/spine/dependency/build/OsDetector.kt b/buildSrc/src/main/kotlin/io/spine/dependency/build/OsDetector.kt index 76d283423..5b479bf36 100644 --- a/buildSrc/src/main/kotlin/io/spine/dependency/build/OsDetector.kt +++ b/buildSrc/src/main/kotlin/io/spine/dependency/build/OsDetector.kt @@ -1,5 +1,5 @@ /* - * 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. 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 000000000..12c28f80a --- /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 0ec075ec6..dd71b4930 100644 --- a/buildSrc/src/main/kotlin/io/spine/dependency/build/Pmd.kt +++ b/buildSrc/src/main/kotlin/io/spine/dependency/build/Pmd.kt @@ -1,5 +1,5 @@ /* - * 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. @@ -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 000000000..fa34b0fa2 --- /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 000000000..08e436dcd --- /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 2c6ee5a4f..1a623f38a 100644 --- a/buildSrc/src/main/kotlin/io/spine/dependency/lib/Aedile.kt +++ b/buildSrc/src/main/kotlin/io/spine/dependency/lib/Aedile.kt @@ -1,5 +1,5 @@ /* - * 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. @@ -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/ApacheHttp.kt b/buildSrc/src/main/kotlin/io/spine/dependency/lib/ApacheHttp.kt index 76e781afb..f3eff5e4d 100644 --- a/buildSrc/src/main/kotlin/io/spine/dependency/lib/ApacheHttp.kt +++ b/buildSrc/src/main/kotlin/io/spine/dependency/lib/ApacheHttp.kt @@ -1,5 +1,5 @@ /* - * 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. diff --git a/buildSrc/src/main/kotlin/io/spine/dependency/lib/AppEngine.kt b/buildSrc/src/main/kotlin/io/spine/dependency/lib/AppEngine.kt index be4c4f137..b4e7336b6 100644 --- a/buildSrc/src/main/kotlin/io/spine/dependency/lib/AppEngine.kt +++ b/buildSrc/src/main/kotlin/io/spine/dependency/lib/AppEngine.kt @@ -1,5 +1,5 @@ /* - * 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. diff --git a/buildSrc/src/main/kotlin/io/spine/dependency/lib/Asm.kt b/buildSrc/src/main/kotlin/io/spine/dependency/lib/Asm.kt index 3975683d9..0a388c9e4 100644 --- a/buildSrc/src/main/kotlin/io/spine/dependency/lib/Asm.kt +++ b/buildSrc/src/main/kotlin/io/spine/dependency/lib/Asm.kt @@ -1,5 +1,5 @@ /* - * 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. @@ -30,13 +30,14 @@ package io.spine.dependency.lib @Suppress("unused", "ConstPropertyName") object Asm { private const val version = "9.6" - const val lib = "org.ow2.asm:asm:$version" + const val group = "org.ow2.asm" + const val lib = "$group:asm:$version" // We use the following artifacts only to force the versions // of the dependencies which are transitive for us. // - const val tree = "org.ow2.asm:asm-tree:$version" - const val analysis = "org.ow2.asm:asm-analysis:$version" - const val util = "org.ow2.asm:asm-util:$version" - const val commons = "org.ow2.asm:asm-commons:$version" + const val tree = "$group:asm-tree:$version" + const val analysis = "$group:asm-analysis:$version" + const val util = "$group:asm-util:$version" + const val commons = "$group:asm-commons:$version" } diff --git a/buildSrc/src/main/kotlin/io/spine/dependency/lib/Auto.kt b/buildSrc/src/main/kotlin/io/spine/dependency/lib/Auto.kt index 526a6834d..6c222b97c 100644 --- a/buildSrc/src/main/kotlin/io/spine/dependency/lib/Auto.kt +++ b/buildSrc/src/main/kotlin/io/spine/dependency/lib/Auto.kt @@ -1,5 +1,5 @@ /* - * 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. @@ -50,11 +50,6 @@ object AutoValue { // https://github.com/ZacSweers/auto-service-ksp object AutoServiceKsp { - /** - * The latest version compatible with Kotlin 1.8.22. - * - * @see Ksp.version - */ - private const val version = "1.1.0" + private const val version = "1.2.0" const val processor = "dev.zacsweers.autoservice:auto-service-ksp:$version" } diff --git a/buildSrc/src/main/kotlin/io/spine/dependency/lib/BouncyCastle.kt b/buildSrc/src/main/kotlin/io/spine/dependency/lib/BouncyCastle.kt index 530b68466..5289d0c45 100644 --- a/buildSrc/src/main/kotlin/io/spine/dependency/lib/BouncyCastle.kt +++ b/buildSrc/src/main/kotlin/io/spine/dependency/lib/BouncyCastle.kt @@ -1,5 +1,5 @@ /* - * 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. 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 db490e776..23f44a410 100644 --- a/buildSrc/src/main/kotlin/io/spine/dependency/lib/Caffeine.kt +++ b/buildSrc/src/main/kotlin/io/spine/dependency/lib/Caffeine.kt @@ -1,5 +1,5 @@ /* - * 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. @@ -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/Clikt.kt b/buildSrc/src/main/kotlin/io/spine/dependency/lib/Clikt.kt index 477315436..3da42ce0f 100644 --- a/buildSrc/src/main/kotlin/io/spine/dependency/lib/Clikt.kt +++ b/buildSrc/src/main/kotlin/io/spine/dependency/lib/Clikt.kt @@ -1,5 +1,5 @@ /* - * 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. diff --git a/buildSrc/src/main/kotlin/io/spine/dependency/lib/CommonsCli.kt b/buildSrc/src/main/kotlin/io/spine/dependency/lib/CommonsCli.kt index 42860c2e6..6063278a5 100644 --- a/buildSrc/src/main/kotlin/io/spine/dependency/lib/CommonsCli.kt +++ b/buildSrc/src/main/kotlin/io/spine/dependency/lib/CommonsCli.kt @@ -1,5 +1,5 @@ /* - * 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. diff --git a/buildSrc/src/main/kotlin/io/spine/dependency/lib/CommonsCodec.kt b/buildSrc/src/main/kotlin/io/spine/dependency/lib/CommonsCodec.kt index 736f848a6..270b704c1 100644 --- a/buildSrc/src/main/kotlin/io/spine/dependency/lib/CommonsCodec.kt +++ b/buildSrc/src/main/kotlin/io/spine/dependency/lib/CommonsCodec.kt @@ -1,5 +1,5 @@ /* - * 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. diff --git a/buildSrc/src/main/kotlin/io/spine/dependency/lib/CommonsLogging.kt b/buildSrc/src/main/kotlin/io/spine/dependency/lib/CommonsLogging.kt index 844a2f077..9f1139c74 100644 --- a/buildSrc/src/main/kotlin/io/spine/dependency/lib/CommonsLogging.kt +++ b/buildSrc/src/main/kotlin/io/spine/dependency/lib/CommonsLogging.kt @@ -1,5 +1,5 @@ /* - * 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. 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 97e65f9a2..2073d766c 100644 --- a/buildSrc/src/main/kotlin/io/spine/dependency/lib/Coroutines.kt +++ b/buildSrc/src/main/kotlin/io/spine/dependency/lib/Coroutines.kt @@ -1,5 +1,5 @@ /* - * 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. @@ -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/Firebase.kt b/buildSrc/src/main/kotlin/io/spine/dependency/lib/Firebase.kt index 3413aff9c..1d798ee4c 100644 --- a/buildSrc/src/main/kotlin/io/spine/dependency/lib/Firebase.kt +++ b/buildSrc/src/main/kotlin/io/spine/dependency/lib/Firebase.kt @@ -1,5 +1,5 @@ /* - * 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. diff --git a/buildSrc/src/main/kotlin/io/spine/dependency/lib/Flogger.kt b/buildSrc/src/main/kotlin/io/spine/dependency/lib/Flogger.kt index 7a4e3983a..769c90543 100644 --- a/buildSrc/src/main/kotlin/io/spine/dependency/lib/Flogger.kt +++ b/buildSrc/src/main/kotlin/io/spine/dependency/lib/Flogger.kt @@ -1,5 +1,5 @@ /* - * 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. diff --git a/buildSrc/src/main/kotlin/io/spine/dependency/lib/GoogleApis.kt b/buildSrc/src/main/kotlin/io/spine/dependency/lib/GoogleApis.kt index 07fcf2e39..7fd33403d 100644 --- a/buildSrc/src/main/kotlin/io/spine/dependency/lib/GoogleApis.kt +++ b/buildSrc/src/main/kotlin/io/spine/dependency/lib/GoogleApis.kt @@ -1,5 +1,5 @@ /* - * 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. diff --git a/buildSrc/src/main/kotlin/io/spine/dependency/lib/GoogleCloud.kt b/buildSrc/src/main/kotlin/io/spine/dependency/lib/GoogleCloud.kt index e736f4c2d..b755168ad 100644 --- a/buildSrc/src/main/kotlin/io/spine/dependency/lib/GoogleCloud.kt +++ b/buildSrc/src/main/kotlin/io/spine/dependency/lib/GoogleCloud.kt @@ -1,5 +1,5 @@ /* - * 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. 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 9449f120f..435d6b413 100644 --- a/buildSrc/src/main/kotlin/io/spine/dependency/lib/Grpc.kt +++ b/buildSrc/src/main/kotlin/io/spine/dependency/lib/Grpc.kt @@ -1,5 +1,5 @@ /* - * 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. @@ -26,25 +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 api = "io.grpc:grpc-api:$version" - const val auth = "io.grpc:grpc-auth:$version" - const val core = "io.grpc:grpc-core:$version" - const val context = "io.grpc:grpc-context:$version" - const val inProcess = "io.grpc:grpc-inprocess:$version" - const val stub = "io.grpc:grpc-stub:$version" - const val okHttp = "io.grpc:grpc-okhttp:$version" - const val protobuf = "io.grpc:grpc-protobuf:$version" - const val protobufLite = "io.grpc:grpc-protobuf-lite:$version" - const val netty = "io.grpc:grpc-netty:$version" - const val nettyShaded = "io.grpc: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 = "io.grpc: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 1187fe47c..05d21dd5a 100644 --- a/buildSrc/src/main/kotlin/io/spine/dependency/lib/GrpcKotlin.kt +++ b/buildSrc/src/main/kotlin/io/spine/dependency/lib/GrpcKotlin.kt @@ -1,5 +1,5 @@ /* - * 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. @@ -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 2cd194938..da9ae9333 100644 --- a/buildSrc/src/main/kotlin/io/spine/dependency/lib/Gson.kt +++ b/buildSrc/src/main/kotlin/io/spine/dependency/lib/Gson.kt @@ -1,5 +1,5 @@ /* - * 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. @@ -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 78dd2a584..91157019a 100644 --- a/buildSrc/src/main/kotlin/io/spine/dependency/lib/Guava.kt +++ b/buildSrc/src/main/kotlin/io/spine/dependency/lib/Guava.kt @@ -1,5 +1,5 @@ /* - * 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. @@ -37,7 +37,8 @@ package io.spine.dependency.lib */ @Suppress("unused", "ConstPropertyName") object Guava { - private const val version = "32.1.3-jre" - const val lib = "com.google.guava:guava:$version" - const val testLib = "com.google.guava:guava-testlib:$version" + 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/HttpClient.kt b/buildSrc/src/main/kotlin/io/spine/dependency/lib/HttpClient.kt index 4e33e5148..526f05f99 100644 --- a/buildSrc/src/main/kotlin/io/spine/dependency/lib/HttpClient.kt +++ b/buildSrc/src/main/kotlin/io/spine/dependency/lib/HttpClient.kt @@ -1,5 +1,5 @@ /* - * 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. diff --git a/buildSrc/src/main/kotlin/io/spine/dependency/lib/IntelliJ.kt b/buildSrc/src/main/kotlin/io/spine/dependency/lib/IntelliJ.kt index 4a97db694..7f9232b75 100644 --- a/buildSrc/src/main/kotlin/io/spine/dependency/lib/IntelliJ.kt +++ b/buildSrc/src/main/kotlin/io/spine/dependency/lib/IntelliJ.kt @@ -1,5 +1,5 @@ /* - * 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. diff --git a/buildSrc/src/main/kotlin/io/spine/dependency/lib/J2ObjC.kt b/buildSrc/src/main/kotlin/io/spine/dependency/lib/J2ObjC.kt index 3bd457752..30984669b 100644 --- a/buildSrc/src/main/kotlin/io/spine/dependency/lib/J2ObjC.kt +++ b/buildSrc/src/main/kotlin/io/spine/dependency/lib/J2ObjC.kt @@ -1,5 +1,5 @@ /* - * 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. 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 7ad22a0e8..b47b0c5d4 100644 --- a/buildSrc/src/main/kotlin/io/spine/dependency/lib/Jackson.kt +++ b/buildSrc/src/main/kotlin/io/spine/dependency/lib/Jackson.kt @@ -1,5 +1,5 @@ /* - * 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. @@ -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/JavaDiffUtils.kt b/buildSrc/src/main/kotlin/io/spine/dependency/lib/JavaDiffUtils.kt index b010d1a28..7cc2e5951 100644 --- a/buildSrc/src/main/kotlin/io/spine/dependency/lib/JavaDiffUtils.kt +++ b/buildSrc/src/main/kotlin/io/spine/dependency/lib/JavaDiffUtils.kt @@ -1,5 +1,5 @@ /* - * 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. diff --git a/buildSrc/src/main/kotlin/io/spine/dependency/lib/JavaJwt.kt b/buildSrc/src/main/kotlin/io/spine/dependency/lib/JavaJwt.kt index f5a32b82b..4d9b1dfb2 100644 --- a/buildSrc/src/main/kotlin/io/spine/dependency/lib/JavaJwt.kt +++ b/buildSrc/src/main/kotlin/io/spine/dependency/lib/JavaJwt.kt @@ -1,5 +1,5 @@ /* - * 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. diff --git a/buildSrc/src/main/kotlin/io/spine/dependency/lib/JavaPoet.kt b/buildSrc/src/main/kotlin/io/spine/dependency/lib/JavaPoet.kt index e17a18066..b99e5033e 100644 --- a/buildSrc/src/main/kotlin/io/spine/dependency/lib/JavaPoet.kt +++ b/buildSrc/src/main/kotlin/io/spine/dependency/lib/JavaPoet.kt @@ -1,5 +1,5 @@ /* - * 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. @@ -30,5 +30,8 @@ package io.spine.dependency.lib @Suppress("unused", "ConstPropertyName") object JavaPoet { private const val version = "1.13.0" - const val lib = "com.squareup:javapoet:$version" + const val group = "com.squareup" + const val artifact = "javapoet" + const val module = "$group:$artifact" + const val lib = "$module:$version" } 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 4db379b6b..e605a168e 100644 --- a/buildSrc/src/main/kotlin/io/spine/dependency/lib/JavaX.kt +++ b/buildSrc/src/main/kotlin/io/spine/dependency/lib/JavaX.kt @@ -1,5 +1,5 @@ /* - * 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. @@ -29,8 +29,9 @@ 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 - const val annotations = "javax.annotation:javax.annotation-api:1.3.2" + // https://github.com/jakartaee/common-annotations-api + const val annotationGroup = "javax.annotation" + const val annotations = "$annotationGroup:javax.annotation-api:1.3.2" const val servletApi = "javax.servlet:javax.servlet-api:3.1.0" } diff --git a/buildSrc/src/main/kotlin/io/spine/dependency/lib/Klaxon.kt b/buildSrc/src/main/kotlin/io/spine/dependency/lib/Klaxon.kt index 3db7e3af8..69089c6cb 100644 --- a/buildSrc/src/main/kotlin/io/spine/dependency/lib/Klaxon.kt +++ b/buildSrc/src/main/kotlin/io/spine/dependency/lib/Klaxon.kt @@ -1,5 +1,5 @@ /* - * 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. 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 5ef694a36..48694c51a 100644 --- a/buildSrc/src/main/kotlin/io/spine/dependency/lib/Kotlin.kt +++ b/buildSrc/src/main/kotlin/io/spine/dependency/lib/Kotlin.kt @@ -1,5 +1,5 @@ /* - * 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. @@ -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.23" + const val runtimeVersion = "2.1.21" + + 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.21" /** * The version of the JetBrains annotations library, which is a transitive @@ -43,24 +57,64 @@ object Kotlin { * * @see Java Annotations */ - private const val annotationsVersion = "24.0.1" + private const val annotationsVersion = "26.0.2" - private const val group = "org.jetbrains.kotlin" + val scriptRuntime = "$group:kotlin-script-runtime:$runtimeVersion" - const val stdLib = "$group:kotlin-stdlib:$version" - const val stdLibCommon = "$group:kotlin-stdlib-common:$version" + object StdLib : Dependency() { + override val version = runtimeVersion + override val group = Kotlin.group - @Deprecated("Please use `stdLib` instead.") - const val stdLibJdk7 = "$group:kotlin-stdlib-jdk7:$version" + 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" - @Deprecated("Please use `stdLib` instead.") - const val stdLibJdk8 = "$group:kotlin-stdlib-jdk8:$version" + override val modules = listOf(itself, common, jdk7, jdk8) + } - const val reflect = "$group:kotlin-reflect:$version" - const val testJUnit5 = "$group:kotlin-test-junit5:$version" + @Deprecated("Please use `StdLib.itself` instead.", ReplaceWith("StdLib.itself")) + val stdLib = StdLib.itself - const val gradlePluginApi = "$group:kotlin-gradle-plugin-api:$version" - const val gradlePluginLib = "$group:kotlin-gradle-plugin:$version" + @Deprecated("Please use `StdLib.common` instead.", ReplaceWith("StdLib.common")) + val stdLibCommon = StdLib.common + + @Deprecated("Please use `StdLib.jdk7` instead.", ReplaceWith("StdLib.jdk7")) + val stdLibJdk7 = StdLib.jdk7 + + @Deprecated("Please use `StdLib.jdk8` instead.") + val stdLibJdk8 = StdLib.jdk8 + + val toolingCore = "$group:kotlin-tooling-core" + val reflect = "$group:kotlin-reflect" + val testJUnit5 = "$group:kotlin-test-junit5" + + /** + * The modules our interest that do not belong to [StdLib]. + */ + override val modules = listOf(reflect, testJUnit5) + + @Deprecated(message = "Please use `GradlePlugin.api` instead.", ReplaceWith("GradlePlugin.api")) + val gradlePluginApi = "$group:kotlin-gradle-plugin-api" + + @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 { + 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/KotlinPoet.kt b/buildSrc/src/main/kotlin/io/spine/dependency/lib/KotlinPoet.kt new file mode 100644 index 000000000..346c5d8d3 --- /dev/null +++ b/buildSrc/src/main/kotlin/io/spine/dependency/lib/KotlinPoet.kt @@ -0,0 +1,35 @@ +/* + * 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.lib + +// https://github.com/square/kotlinpoet +@Suppress("unused", "ConstPropertyName") +object KotlinPoet { + private const val version = "2.0.0" + const val lib = "com.squareup:kotlinpoet:$version" + const val ksp = "com.squareup:kotlinpoet-ksp:$version" +} 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 ed29f108f..92a348d1b 100644 --- a/buildSrc/src/main/kotlin/io/spine/dependency/lib/KotlinSemver.kt +++ b/buildSrc/src/main/kotlin/io/spine/dependency/lib/KotlinSemver.kt @@ -1,5 +1,5 @@ /* - * 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. @@ -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 5b6572c30..ee521e35c 100644 --- a/buildSrc/src/main/kotlin/io/spine/dependency/lib/KotlinX.kt +++ b/buildSrc/src/main/kotlin/io/spine/dependency/lib/KotlinX.kt @@ -1,5 +1,5 @@ /* - * 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. @@ -27,15 +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.7.3" - const val core = "$group:kotlinx-coroutines-core:$version" - const val jdk8 = "$group:kotlinx-coroutines-jdk8:$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/Log4j2.kt b/buildSrc/src/main/kotlin/io/spine/dependency/lib/Log4j2.kt index 4cbdb4a7e..d4f2bd2eb 100644 --- a/buildSrc/src/main/kotlin/io/spine/dependency/lib/Log4j2.kt +++ b/buildSrc/src/main/kotlin/io/spine/dependency/lib/Log4j2.kt @@ -1,5 +1,5 @@ /* - * 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. @@ -29,7 +29,7 @@ package io.spine.dependency.lib /** * An open-source logging framework. * - * Spine uses its own [logging library][Spine.Logging], but also + * Spine uses its own [logging library][io.spine.dependency.local.Logging], but also * provides a backend implementation for [Log4j2]. This is why * this dependency is needed. * diff --git a/buildSrc/src/main/kotlin/io/spine/dependency/lib/Netty.kt b/buildSrc/src/main/kotlin/io/spine/dependency/lib/Netty.kt index f88b098c9..c317bb3e7 100644 --- a/buildSrc/src/main/kotlin/io/spine/dependency/lib/Netty.kt +++ b/buildSrc/src/main/kotlin/io/spine/dependency/lib/Netty.kt @@ -1,5 +1,5 @@ /* - * 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. diff --git a/buildSrc/src/main/kotlin/io/spine/dependency/lib/Okio.kt b/buildSrc/src/main/kotlin/io/spine/dependency/lib/Okio.kt index 522e655af..3107d7607 100644 --- a/buildSrc/src/main/kotlin/io/spine/dependency/lib/Okio.kt +++ b/buildSrc/src/main/kotlin/io/spine/dependency/lib/Okio.kt @@ -1,5 +1,5 @@ /* - * 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. diff --git a/buildSrc/src/main/kotlin/io/spine/dependency/lib/Plexus.kt b/buildSrc/src/main/kotlin/io/spine/dependency/lib/Plexus.kt index 40d4149e6..e39390673 100644 --- a/buildSrc/src/main/kotlin/io/spine/dependency/lib/Plexus.kt +++ b/buildSrc/src/main/kotlin/io/spine/dependency/lib/Plexus.kt @@ -1,5 +1,5 @@ /* - * 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. 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 6794c1a5c..203059e79 100644 --- a/buildSrc/src/main/kotlin/io/spine/dependency/lib/Protobuf.kt +++ b/buildSrc/src/main/kotlin/io/spine/dependency/lib/Protobuf.kt @@ -1,5 +1,5 @@ /* - * 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. @@ -32,8 +32,8 @@ package io.spine.dependency.lib "ConstPropertyName" /* https://bit.ly/kotlin-prop-names */ ) object Protobuf { - private const val group = "com.google.protobuf" - const val version = "3.25.1" + const val group = "com.google.protobuf" + const val version = "4.31.0" /** * 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 2bf9b5c98..601be9a10 100644 --- a/buildSrc/src/main/kotlin/io/spine/dependency/lib/Roaster.kt +++ b/buildSrc/src/main/kotlin/io/spine/dependency/lib/Roaster.kt @@ -1,5 +1,5 @@ /* - * 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. @@ -37,8 +37,9 @@ 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 api = "org.jboss.forge.roaster:roaster-api:$version" - const val jdt = "org.jboss.forge.roaster:roaster-jdt:$version" + const val group = "org.jboss.forge.roaster" + const val api = "$group:roaster-api:$version" + const val jdt = "$group:roaster-jdt:$version" } diff --git a/buildSrc/src/main/kotlin/io/spine/dependency/lib/Slf4J.kt b/buildSrc/src/main/kotlin/io/spine/dependency/lib/Slf4J.kt index ecfa86e17..bd5b9df2e 100644 --- a/buildSrc/src/main/kotlin/io/spine/dependency/lib/Slf4J.kt +++ b/buildSrc/src/main/kotlin/io/spine/dependency/lib/Slf4J.kt @@ -1,5 +1,5 @@ /* - * 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. diff --git a/buildSrc/src/main/kotlin/io/spine/dependency/local/ArtifactVersion.kt b/buildSrc/src/main/kotlin/io/spine/dependency/local/ArtifactVersion.kt index bd1b9b598..77497b215 100644 --- a/buildSrc/src/main/kotlin/io/spine/dependency/local/ArtifactVersion.kt +++ b/buildSrc/src/main/kotlin/io/spine/dependency/local/ArtifactVersion.kt @@ -1,5 +1,5 @@ /* - * 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. @@ -37,15 +37,23 @@ object ArtifactVersion { * * @see spine-base */ - const val base = "2.0.0-SNAPSHOT.215" - const val baseForBuildScript = "2.0.0-SNAPSHOT.215" + @Deprecated(message = "Please use `Base.version`.", ReplaceWith("Base.version")) + const val base = Base.version + + @Suppress("unused") + @Deprecated( + message = "Please use `Base.versionForBuildScript`.", + ReplaceWith("Base.versionForBuildScript") + ) + const val baseForBuildScript = Base.versionForBuildScript /** * The version of [Spine.reflect]. * * @see spine-reflect */ - const val reflect = "2.0.0-SNAPSHOT.191" + @Deprecated(message = "Please use `Reflect.version`.", ReplaceWith("Reflect.version")) + const val reflect = Reflect.version /** * The version of [Logging]. @@ -58,7 +66,8 @@ object ArtifactVersion { * * @see spine-testlib */ - const val testlib = "2.0.0-SNAPSHOT.184" + @Deprecated(message = "Please use `TestLib.version`.", ReplaceWith("TestLib.version")) + const val testlib = TestLib.version /** * The version of `core-java`. @@ -71,41 +80,52 @@ object ArtifactVersion { * * @see spine-model-compiler */ - const val mc = "2.0.0-SNAPSHOT.133" + @Suppress("unused") + @Deprecated( + message = "Please use `ModelCompiler.version` instead.", + ReplaceWith("ModelCompiler.version") + ) + const val mc = ModelCompiler.version /** * The version of [Spine.baseTypes]. * * @see spine-base-types */ - const val baseTypes = "2.0.0-SNAPSHOT.126" + @Deprecated(message = "Please use `BaseTypes.version`.", ReplaceWith("BaseTypes.version")) + const val baseTypes = BaseTypes.version /** * The version of [Spine.time]. * * @see spine-time */ - const val time = "2.0.0-SNAPSHOT.135" + @Deprecated(message = "Please use `Time.version`.", ReplaceWith("Time.version")) + const val time = Time.version /** * The version of [Spine.change]. * * @see spine-change */ - const val change = "2.0.0-SNAPSHOT.118" + @Deprecated(message = "Please use `Change.version`.", ReplaceWith("Change.version")) + const val change = Change.version /** * The version of [Spine.text]. * * @see spine-text */ - const val text = "2.0.0-SNAPSHOT.6" + @Deprecated(message = "Please use `Text.version`.", ReplaceWith("Text.version")) + const val text = Text.version /** * The version of [Spine.toolBase]. * * @see spine-tool-base */ + @Suppress("unused") + @Deprecated(message = "Please use `ToolBase.version`.", ReplaceWith("ToolBase.version")) const val toolBase = ToolBase.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 new file mode 100644 index 000000000..448a11cda --- /dev/null +++ b/buildSrc/src/main/kotlin/io/spine/dependency/local/Base.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. + */ + +package io.spine.dependency.local + +/** + * Spine Base module. + * + * @see spine-base + */ +@Suppress("ConstPropertyName") +object Base { + const val version = "2.0.0-SNAPSHOT.322" + const val versionForBuildScript = "2.0.0-SNAPSHOT.317" + const val group = Spine.group + const val artifact = "spine-base" + const val lib = "$group:$artifact:$version" + const val format = "$group:spine-format:$version" + const val libForBuildScript = "$group:$artifact:$versionForBuildScript" +} diff --git a/buildSrc/src/main/kotlin/io/spine/dependency/local/BaseTypes.kt b/buildSrc/src/main/kotlin/io/spine/dependency/local/BaseTypes.kt new file mode 100644 index 000000000..b0b534d53 --- /dev/null +++ b/buildSrc/src/main/kotlin/io/spine/dependency/local/BaseTypes.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.local + +/** + * Spine Base module. + * + * @see spine-base-types + */ +@Suppress("ConstPropertyName") +object BaseTypes { + const val version = "2.0.0-SNAPSHOT.210" + 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 new file mode 100644 index 000000000..24365800d --- /dev/null +++ b/buildSrc/src/main/kotlin/io/spine/dependency/local/Change.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.local + +/** + * Spine Reflect library. + * + * @see spine-change + */ +@Suppress("ConstPropertyName") +object Change { + 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 0b3682c98..27506d40b 100644 --- a/buildSrc/src/main/kotlin/io/spine/dependency/local/CoreJava.kt +++ b/buildSrc/src/main/kotlin/io/spine/dependency/local/CoreJava.kt @@ -1,5 +1,5 @@ /* - * 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. @@ -34,9 +34,15 @@ package io.spine.dependency.local @Suppress("ConstPropertyName", "unused") object CoreJava { const val group = Spine.group - const val version = "2.0.0-SNAPSHOT.177" - const val core = "$group:spine-core:$version" - const val client = "$group:spine-client:$version" - const val server = "$group:spine-server:$version" + const val version = "2.0.0-SNAPSHOT.316" + + const val coreArtifact = "spine-core" + const val clientArtifact = "spine-client" + const val serverArtifact = "spine-server" + + const val core = "$group:$coreArtifact:$version" + const val client = "$group:$clientArtifact:$version" + const val server = "$group:$serverArtifact:$version" + const val testUtilServer = "${Spine.toolsGroup}:spine-testutil-server:$version" } diff --git a/buildSrc/src/main/kotlin/io/spine/dependency/local/Logging.kt b/buildSrc/src/main/kotlin/io/spine/dependency/local/Logging.kt index cb600b927..b1a00ab0c 100644 --- a/buildSrc/src/main/kotlin/io/spine/dependency/local/Logging.kt +++ b/buildSrc/src/main/kotlin/io/spine/dependency/local/Logging.kt @@ -1,5 +1,5 @@ /* - * 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. @@ -33,9 +33,12 @@ package io.spine.dependency.local */ @Suppress("ConstPropertyName", "unused") object Logging { - const val version = "2.0.0-SNAPSHOT.240" + const val version = "2.0.0-SNAPSHOT.242" const val group = Spine.group - const val lib = "$group:spine-logging:$version" + + const val loggingArtifact = "spine-logging" + + const val lib = "$group:$loggingArtifact:$version" const val libJvm = "$group:spine-logging-jvm:$version" const val log4j2Backend = "$group:spine-logging-log4j2-backend:$version" @@ -43,10 +46,12 @@ object Logging { const val grpcContext = "$group:spine-logging-grpc-context:$version" const val smokeTest = "$group:spine-logging-smoke-test:$version" + const val testLib = "${Spine.toolsGroup}:spine-logging-testlib:$version" + // Transitive dependencies. // Make `public` and use them to force a version in a particular repository, if needed. internal const val julBackend = "$group:spine-logging-jul-backend:$version" - internal const val middleware = "$group:spine-logging-middleware:$version" + const val middleware = "$group:spine-logging-middleware:$version" internal const val platformGenerator = "$group:spine-logging-platform-generator:$version" internal const val jvmDefaultPlatform = "$group:spine-logging-jvm-default-platform:$version" } 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 a2f8a59ab..6ab0a9565 100644 --- a/buildSrc/src/main/kotlin/io/spine/dependency/local/McJava.kt +++ b/buildSrc/src/main/kotlin/io/spine/dependency/local/McJava.kt @@ -1,5 +1,5 @@ /* - * 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. @@ -42,12 +42,12 @@ object McJava { /** * The version used to in the build classpath. */ - const val dogfoodingVersion = "2.0.0-SNAPSHOT.244" + const val dogfoodingVersion = "2.0.0-SNAPSHOT.320" /** * The version to be used for integration tests. */ - const val version = "2.0.0-SNAPSHOT.244" + const val version = "2.0.0-SNAPSHOT.320" /** * The ID of the Gradle plugin. diff --git a/buildSrc/src/main/kotlin/io/spine/dependency/local/ModelCompiler.kt b/buildSrc/src/main/kotlin/io/spine/dependency/local/ModelCompiler.kt new file mode 100644 index 000000000..5f9e54117 --- /dev/null +++ b/buildSrc/src/main/kotlin/io/spine/dependency/local/ModelCompiler.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.local + +/** + * Spine Model Compiler Gradle API. + * + * @see spine-model-compiler + */ +@Suppress("ConstPropertyName") +object ModelCompiler { + const val version = "2.0.0-SNAPSHOT.133" + const val group = Spine.toolsGroup + const val artifact = "spine-model-compiler" + const val lib = "$group:$artifact:$version" +} 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 c01bd270c..ae7f53542 100644 --- a/buildSrc/src/main/kotlin/io/spine/dependency/local/ProtoData.kt +++ b/buildSrc/src/main/kotlin/io/spine/dependency/local/ProtoData.kt @@ -1,5 +1,5 @@ /* - * 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. @@ -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.64.0" + private const val fallbackVersion = "0.96.4" /** * 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.61.8" + private const val fallbackDfVersion = "0.96.4" /** * The artifact for the ProtoData Gradle plugin. @@ -106,6 +105,9 @@ object ProtoData { val backend get() = "$group:protodata-backend:$version" + val params + get() = "$group:protodata-params:$version" + val protocPlugin get() = "$group:protodata-protoc:$version" @@ -115,8 +117,10 @@ object ProtoData { val cliApi get() = "$group:protodata-cli-api:$version" + val javaModule = "$group:protodata-java" + fun java(version: String): String = - "$group:protodata-java:$version" + "$javaModule:$version" val java get() = java(version) 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 0795460f1..6667d1a04 100644 --- a/buildSrc/src/main/kotlin/io/spine/dependency/local/ProtoTap.kt +++ b/buildSrc/src/main/kotlin/io/spine/dependency/local/ProtoTap.kt @@ -1,5 +1,5 @@ /* - * 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. @@ -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.10.0" 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/Reflect.kt b/buildSrc/src/main/kotlin/io/spine/dependency/local/Reflect.kt new file mode 100644 index 000000000..fbf37f1e8 --- /dev/null +++ b/buildSrc/src/main/kotlin/io/spine/dependency/local/Reflect.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.local + +/** + * Spine Reflect library. + * + * @see spine-reflect + */ +@Suppress("ConstPropertyName") +object Reflect { + const val version = "2.0.0-SNAPSHOT.191" + const val group = Spine.group + const val artifact = "spine-reflect" + const val lib = "$group:$artifact:$version" +} diff --git a/buildSrc/src/main/kotlin/io/spine/dependency/local/Spine.kt b/buildSrc/src/main/kotlin/io/spine/dependency/local/Spine.kt index fb69374c8..d7b6d0cde 100644 --- a/buildSrc/src/main/kotlin/io/spine/dependency/local/Spine.kt +++ b/buildSrc/src/main/kotlin/io/spine/dependency/local/Spine.kt @@ -1,5 +1,5 @@ /* - * 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. @@ -35,30 +35,65 @@ object Spine { const val group = "io.spine" const val toolsGroup = "io.spine.tools" - const val base = "$group:spine-base:${ArtifactVersion.base}" - const val baseForBuildScript = "$group:spine-base:${ArtifactVersion.baseForBuildScript}" + @Deprecated(message = "Please use `Base.lib`.", ReplaceWith("Base.lib")) + const val base = Base.lib - const val reflect = "$group:spine-reflect:${ArtifactVersion.reflect}" - const val baseTypes = "$group:spine-base-types:${ArtifactVersion.baseTypes}" - const val time = "$group:spine-time:${ArtifactVersion.time}" - const val change = "$group:spine-change:${ArtifactVersion.change}" - const val text = "$group:spine-text:${ArtifactVersion.text}" + @Deprecated( + message = "Please use `Base.libForBuildScript`.", + ReplaceWith("Base.libForBuildScript") + ) + const val baseForBuildScript = Base.libForBuildScript - const val testlib = "$toolsGroup:spine-testlib:${ArtifactVersion.testlib}" - const val testUtilTime = "$toolsGroup:spine-testutil-time:${ArtifactVersion.time}" + @Deprecated(message = "Please use `Reflect.lib`.", ReplaceWith("Reflect.lib")) + const val reflect = Reflect.lib + + @Deprecated(message = "Please use `BaseTypes.lib`.", ReplaceWith("BaseTypes.lib")) + const val baseTypes = BaseTypes.lib + + @Deprecated(message = "Please use `Time.lib`.", ReplaceWith("Time.lib")) + const val time = Time.lib + + @Deprecated(message = "Please use `Change.lib`.", ReplaceWith("Change.lib")) + const val change = Change.lib + + @Deprecated(message = "Please use `Text.lib`.", ReplaceWith("Text.lib")) + const val text = Text.lib + + @Deprecated(message = "Please use `TestLib.lib`.", ReplaceWith("TestLib.lib")) + const val testlib = TestLib.lib + + @Deprecated(message = "Please use `Time.testLib`.", ReplaceWith("Time.testLib")) + const val testUtilTime = Time.testLib @Deprecated(message = "Please use `ToolBase.psiJava` instead`.") - const val psiJava = "$toolsGroup:spine-psi-java:${ArtifactVersion.toolBase}" - @Deprecated(message = "Please use `ToolBase.psiJava` instead`.") - const val psiJavaBundle = "$toolsGroup:spine-psi-java-bundle:${ArtifactVersion.toolBase}" - @Deprecated(message = "Please use `ToolBase.lib` instead`.") - const val toolBase = "$toolsGroup:spine-tool-base:${ArtifactVersion.toolBase}" - @Deprecated(message = "Please use `ToolBase.pluginBase` instead`.") - const val pluginBase = "$toolsGroup:spine-plugin-base:${ArtifactVersion.toolBase}" - @Deprecated(message = "Please use `ToolBase.pluginTestlib` instead`.") - const val pluginTestlib = "$toolsGroup:spine-plugin-testlib:${ArtifactVersion.toolBase}" - - const val modelCompiler = "$toolsGroup:spine-model-compiler:${ArtifactVersion.mc}" + const val psiJava = "$toolsGroup:spine-psi-java:${ToolBase.version}" + + @Deprecated( + message = "Please use `ToolBase.psiJava` instead`.", + ReplaceWith("ToolBase.psiJava") + ) + const val psiJavaBundle = "$toolsGroup:spine-psi-java-bundle:${ToolBase.version}" + + @Deprecated(message = "Please use `ToolBase.lib` instead`.", ReplaceWith("ToolBase.lib")) + const val toolBase = "$toolsGroup:spine-tool-base:${ToolBase.version}" + + @Deprecated( + message = "Please use `ToolBase.pluginBase` instead`.", + ReplaceWith("ToolBase.pluginBase") + ) + const val pluginBase = "$toolsGroup:spine-plugin-base:${ToolBase.version}" + + @Deprecated( + message = "Please use `ToolBase.pluginTestlib` instead`.", + ReplaceWith("ToolBase.pluginTestlib") + ) + const val pluginTestlib = ToolBase.pluginTestlib + + @Deprecated( + message = "Please use `ModelCompiler.lib` instead.", + ReplaceWith("ModelCompiler.lib") + ) + const val modelCompiler = ModelCompiler.lib @Deprecated( message = "Please use top level `McJava` object instead.", diff --git a/buildSrc/src/main/kotlin/io/spine/dependency/local/Time.kt b/buildSrc/src/main/kotlin/io/spine/dependency/local/Time.kt new file mode 100644 index 000000000..289adeeb5 --- /dev/null +++ b/buildSrc/src/main/kotlin/io/spine/dependency/local/Time.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. + */ + +package io.spine.dependency.local + +/** + * Spine Time library. + * + * @see spine-time + */ +@Suppress("ConstPropertyName") +object Time { + const val version = "2.0.0-SNAPSHOT.203" + const val group = Spine.group + const val artifact = "spine-time" + const val lib = "$group:$artifact:$version" + + const val testLib = "${Spine.toolsGroup}:spine-time-testlib:$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 d19a1aaa4..7d001cfcc 100644 --- a/buildSrc/src/main/kotlin/io/spine/dependency/local/ToolBase.kt +++ b/buildSrc/src/main/kotlin/io/spine/dependency/local/ToolBase.kt @@ -1,5 +1,5 @@ /* - * 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. @@ -29,18 +29,27 @@ package io.spine.dependency.local /** * Artifacts of the `tool-base` module. * - * @see spine-tool-base + * @see tool-base */ @Suppress("ConstPropertyName", "unused") object ToolBase { const val group = Spine.toolsGroup - const val version = "2.0.0-SNAPSHOT.233" + const val version = "2.0.0-SNAPSHOT.341" - const val lib = "$group:spine-tool-base:$version" - const val pluginBase = "$group:spine-plugin-base:$version" - const val pluginTestlib = "$group:spine-plugin-testlib:$version" + const val lib = "$group:tool-base:$version" + const val pluginBase = "$group:plugin-base:$version" + const val pluginTestlib = "$group:plugin-testlib:$version" + const val intellijPlatform = "$group:intellij-platform:$version" const val intellijPlatformJava = "$group:intellij-platform-java:$version" - const val psiJava = "$group:spine-psi-java:$version" + const val psi = "$group:psi:$version" + const val psiJava = "$group:psi-java:$version" + + const val gradleRootPlugin = "$group:gradle-root-plugin:$version" + const val gradlePluginApi = "$group:gradle-plugin-api:$version" + const val gradlePluginApiTestFixtures = "$group:gradle-plugin-api-test-fixtures:$version" + + const val jvmTools = "$group:jvm-tools:$version" + const val jvmToolPlugins = "$group:jvm-tool-all-plugins:$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 7fdcfa4d6..7326cedb8 100644 --- a/buildSrc/src/main/kotlin/io/spine/dependency/local/Validation.kt +++ b/buildSrc/src/main/kotlin/io/spine/dependency/local/Validation.kt @@ -1,5 +1,5 @@ /* - * 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. @@ -31,21 +31,24 @@ package io.spine.dependency.local * * See [`SpineEventEngine/validation`](https://github.com/SpineEventEngine/validation/). */ -@Suppress("unused", "ConstPropertyName") +@Suppress("ConstPropertyName", "unused") object Validation { /** * The version of the Validation library artifacts. */ - const val version = "2.0.0-SNAPSHOT.160" + const val version = "2.0.0-SNAPSHOT.340" const val group = "io.spine.validation" private const val prefix = "spine-validation" - const val runtime = "$group:$prefix-java-runtime:$version" + const val runtimeModule = "$group:$prefix-java-runtime" + const val runtime = "$runtimeModule:$version" const val java = "$group:$prefix-java:$version" + const val javaBundleModule = "$group:$prefix-java-bundle" + /** Obtains the artifact for the `java-bundle` artifact of the given version. */ - fun javaBundle(version: String) = "$group:$prefix-java-bundle:$version" + fun javaBundle(version: String) = "$javaBundleModule:$version" val javaBundle = javaBundle(version) 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 7e158382a..760c11610 100644 --- a/buildSrc/src/main/kotlin/io/spine/dependency/test/AssertK.kt +++ b/buildSrc/src/main/kotlin/io/spine/dependency/test/AssertK.kt @@ -1,5 +1,5 @@ /* - * 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. @@ -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 8dde22cbf..e540c2cdb 100644 --- a/buildSrc/src/main/kotlin/io/spine/dependency/test/Hamcrest.kt +++ b/buildSrc/src/main/kotlin/io/spine/dependency/test/Hamcrest.kt @@ -1,5 +1,5 @@ /* - * 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. @@ -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 2ef5b6abf..813c7ff16 100644 --- a/buildSrc/src/main/kotlin/io/spine/dependency/test/JUnit.kt +++ b/buildSrc/src/main/kotlin/io/spine/dependency/test/JUnit.kt @@ -1,5 +1,5 @@ /* - * 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. @@ -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 9b807d590..5f007ec51 100644 --- a/buildSrc/src/main/kotlin/io/spine/dependency/test/Jacoco.kt +++ b/buildSrc/src/main/kotlin/io/spine/dependency/test/Jacoco.kt @@ -1,5 +1,5 @@ /* - * 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. @@ -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 553b59cb8..8de10ff6c 100644 --- a/buildSrc/src/main/kotlin/io/spine/dependency/test/Kotest.kt +++ b/buildSrc/src/main/kotlin/io/spine/dependency/test/Kotest.kt @@ -1,5 +1,5 @@ /* - * 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. @@ -53,7 +53,7 @@ object Kotest { // https://github.com/kotest/kotest-gradle-plugin object JvmGradlePlugin { - const val version = "0.4.11" + const val version = "0.4.10" const val id = "io.kotest" const val classpath = "$group:kotest-gradle-plugin:$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 new file mode 100644 index 000000000..bde365ab7 --- /dev/null +++ b/buildSrc/src/main/kotlin/io/spine/dependency/test/KotlinCompileTesting.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.test + +/** + * A library for in-process compilation of Kotlin and Java code compilation. + * + * @see GitHub repo + */ +@Suppress("unused", "ConstPropertyName") +object KotlinCompileTesting { + private const val version = "0.7.1" + 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 744ee77ca..61897cc85 100644 --- a/buildSrc/src/main/kotlin/io/spine/dependency/test/Kover.kt +++ b/buildSrc/src/main/kotlin/io/spine/dependency/test/Kover.kt @@ -1,5 +1,5 @@ /* - * 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. @@ -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/OpenTest4J.kt b/buildSrc/src/main/kotlin/io/spine/dependency/test/OpenTest4J.kt index e0f01d867..1e22fb344 100644 --- a/buildSrc/src/main/kotlin/io/spine/dependency/test/OpenTest4J.kt +++ b/buildSrc/src/main/kotlin/io/spine/dependency/test/OpenTest4J.kt @@ -1,5 +1,5 @@ /* - * 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. diff --git a/buildSrc/src/main/kotlin/io/spine/dependency/test/SystemLambda.kt b/buildSrc/src/main/kotlin/io/spine/dependency/test/SystemLambda.kt index f454a0b1a..5f0eef8c6 100644 --- a/buildSrc/src/main/kotlin/io/spine/dependency/test/SystemLambda.kt +++ b/buildSrc/src/main/kotlin/io/spine/dependency/test/SystemLambda.kt @@ -1,5 +1,5 @@ /* - * 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. diff --git a/buildSrc/src/main/kotlin/io/spine/dependency/test/TestKitTruth.kt b/buildSrc/src/main/kotlin/io/spine/dependency/test/TestKitTruth.kt index 486c6251e..bfec2113c 100644 --- a/buildSrc/src/main/kotlin/io/spine/dependency/test/TestKitTruth.kt +++ b/buildSrc/src/main/kotlin/io/spine/dependency/test/TestKitTruth.kt @@ -1,5 +1,5 @@ /* - * 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. 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 2f5ca06e0..cbfb4ada7 100644 --- a/buildSrc/src/main/kotlin/io/spine/dependency/test/Truth.kt +++ b/buildSrc/src/main/kotlin/io/spine/dependency/test/Truth.kt @@ -1,5 +1,5 @@ /* - * 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. @@ -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/docs/MarkdownDocument.kt b/buildSrc/src/main/kotlin/io/spine/docs/MarkdownDocument.kt index e5db94adf..23937bdaa 100644 --- a/buildSrc/src/main/kotlin/io/spine/docs/MarkdownDocument.kt +++ b/buildSrc/src/main/kotlin/io/spine/docs/MarkdownDocument.kt @@ -1,5 +1,5 @@ /* - * 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. diff --git a/buildSrc/src/main/kotlin/io/spine/gradle/Build.kt b/buildSrc/src/main/kotlin/io/spine/gradle/Build.kt index 82adf54e2..327031e05 100644 --- a/buildSrc/src/main/kotlin/io/spine/gradle/Build.kt +++ b/buildSrc/src/main/kotlin/io/spine/gradle/Build.kt @@ -1,5 +1,5 @@ /* - * 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. diff --git a/buildSrc/src/main/kotlin/io/spine/gradle/Clean.kt b/buildSrc/src/main/kotlin/io/spine/gradle/Clean.kt index 53d42eecc..380e835a1 100644 --- a/buildSrc/src/main/kotlin/io/spine/gradle/Clean.kt +++ b/buildSrc/src/main/kotlin/io/spine/gradle/Clean.kt @@ -1,5 +1,5 @@ /* - * 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. diff --git a/buildSrc/src/main/kotlin/io/spine/gradle/ConfigTester.kt b/buildSrc/src/main/kotlin/io/spine/gradle/ConfigTester.kt index b97c6ebfe..3de99c4e9 100644 --- a/buildSrc/src/main/kotlin/io/spine/gradle/ConfigTester.kt +++ b/buildSrc/src/main/kotlin/io/spine/gradle/ConfigTester.kt @@ -1,5 +1,5 @@ /* - * 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. diff --git a/buildSrc/src/main/kotlin/io/spine/gradle/ProjectExtensions.kt b/buildSrc/src/main/kotlin/io/spine/gradle/ProjectExtensions.kt index e3ce8d3c9..deda20363 100644 --- a/buildSrc/src/main/kotlin/io/spine/gradle/ProjectExtensions.kt +++ b/buildSrc/src/main/kotlin/io/spine/gradle/ProjectExtensions.kt @@ -1,5 +1,5 @@ /* - * Copyright 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. @@ -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 585f7825d..000000000 --- a/buildSrc/src/main/kotlin/io/spine/gradle/Repositories.kt +++ /dev/null @@ -1,370 +0,0 @@ -/* - * Copyright 2024, 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 c187e8f4e..aa2759dec 100644 --- a/buildSrc/src/main/kotlin/io/spine/gradle/RunBuild.kt +++ b/buildSrc/src/main/kotlin/io/spine/gradle/RunBuild.kt @@ -1,5 +1,5 @@ /* - * 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. @@ -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 e3084cabd..894263026 100644 --- a/buildSrc/src/main/kotlin/io/spine/gradle/RunGradle.kt +++ b/buildSrc/src/main/kotlin/io/spine/gradle/RunGradle.kt @@ -1,5 +1,5 @@ /* - * 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. @@ -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/Runtime.kt b/buildSrc/src/main/kotlin/io/spine/gradle/Runtime.kt index facaf78d0..c5b5f5464 100644 --- a/buildSrc/src/main/kotlin/io/spine/gradle/Runtime.kt +++ b/buildSrc/src/main/kotlin/io/spine/gradle/Runtime.kt @@ -1,5 +1,5 @@ /* - * 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. diff --git a/buildSrc/src/main/kotlin/io/spine/gradle/StringExtensions.kt b/buildSrc/src/main/kotlin/io/spine/gradle/StringExtensions.kt index 0863dd3c6..a18589209 100644 --- a/buildSrc/src/main/kotlin/io/spine/gradle/StringExtensions.kt +++ b/buildSrc/src/main/kotlin/io/spine/gradle/StringExtensions.kt @@ -1,5 +1,5 @@ /* - * 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. diff --git a/buildSrc/src/main/kotlin/io/spine/gradle/TaskName.kt b/buildSrc/src/main/kotlin/io/spine/gradle/TaskName.kt index 05ab25265..7c7abd129 100644 --- a/buildSrc/src/main/kotlin/io/spine/gradle/TaskName.kt +++ b/buildSrc/src/main/kotlin/io/spine/gradle/TaskName.kt @@ -1,5 +1,5 @@ /* - * 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. diff --git a/buildSrc/src/main/kotlin/io/spine/gradle/VersionWriter.kt b/buildSrc/src/main/kotlin/io/spine/gradle/VersionWriter.kt index b24c202f4..d3d4323f8 100644 --- a/buildSrc/src/main/kotlin/io/spine/gradle/VersionWriter.kt +++ b/buildSrc/src/main/kotlin/io/spine/gradle/VersionWriter.kt @@ -1,5 +1,5 @@ /* - * 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. diff --git a/buildSrc/src/main/kotlin/io/spine/gradle/base/Tasks.kt b/buildSrc/src/main/kotlin/io/spine/gradle/base/Tasks.kt index f60b7c5f8..c77b79560 100644 --- a/buildSrc/src/main/kotlin/io/spine/gradle/base/Tasks.kt +++ b/buildSrc/src/main/kotlin/io/spine/gradle/base/Tasks.kt @@ -1,5 +1,5 @@ /* - * 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. 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 42744183b..122a60496 100644 --- a/buildSrc/src/main/kotlin/io/spine/gradle/checkstyle/CheckStyleConfig.kt +++ b/buildSrc/src/main/kotlin/io/spine/gradle/checkstyle/CheckStyleConfig.kt @@ -1,5 +1,5 @@ /* - * 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. @@ -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/dart/DartContext.kt b/buildSrc/src/main/kotlin/io/spine/gradle/dart/DartContext.kt index 6c192e58a..c32c10f17 100644 --- a/buildSrc/src/main/kotlin/io/spine/gradle/dart/DartContext.kt +++ b/buildSrc/src/main/kotlin/io/spine/gradle/dart/DartContext.kt @@ -1,5 +1,5 @@ /* - * 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. diff --git a/buildSrc/src/main/kotlin/io/spine/gradle/dart/DartEnvironment.kt b/buildSrc/src/main/kotlin/io/spine/gradle/dart/DartEnvironment.kt index 48883e17c..4e4ae839c 100644 --- a/buildSrc/src/main/kotlin/io/spine/gradle/dart/DartEnvironment.kt +++ b/buildSrc/src/main/kotlin/io/spine/gradle/dart/DartEnvironment.kt @@ -1,5 +1,5 @@ /* - * 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. diff --git a/buildSrc/src/main/kotlin/io/spine/gradle/dart/DartExtension.kt b/buildSrc/src/main/kotlin/io/spine/gradle/dart/DartExtension.kt index e0913b5d1..57a2bcfd2 100644 --- a/buildSrc/src/main/kotlin/io/spine/gradle/dart/DartExtension.kt +++ b/buildSrc/src/main/kotlin/io/spine/gradle/dart/DartExtension.kt @@ -1,5 +1,5 @@ /* - * 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. diff --git a/buildSrc/src/main/kotlin/io/spine/gradle/dart/plugin/DartPlugins.kt b/buildSrc/src/main/kotlin/io/spine/gradle/dart/plugin/DartPlugins.kt index 3d88bec02..9d76a77f9 100644 --- a/buildSrc/src/main/kotlin/io/spine/gradle/dart/plugin/DartPlugins.kt +++ b/buildSrc/src/main/kotlin/io/spine/gradle/dart/plugin/DartPlugins.kt @@ -1,5 +1,5 @@ /* - * 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. diff --git a/buildSrc/src/main/kotlin/io/spine/gradle/dart/plugin/Protobuf.kt b/buildSrc/src/main/kotlin/io/spine/gradle/dart/plugin/Protobuf.kt index 54cd9b01d..bfd503fd1 100644 --- a/buildSrc/src/main/kotlin/io/spine/gradle/dart/plugin/Protobuf.kt +++ b/buildSrc/src/main/kotlin/io/spine/gradle/dart/plugin/Protobuf.kt @@ -1,5 +1,5 @@ /* - * 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. diff --git a/buildSrc/src/main/kotlin/io/spine/gradle/dart/task/Build.kt b/buildSrc/src/main/kotlin/io/spine/gradle/dart/task/Build.kt index 97cdf5135..163747e8a 100644 --- a/buildSrc/src/main/kotlin/io/spine/gradle/dart/task/Build.kt +++ b/buildSrc/src/main/kotlin/io/spine/gradle/dart/task/Build.kt @@ -1,5 +1,5 @@ /* - * 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. diff --git a/buildSrc/src/main/kotlin/io/spine/gradle/dart/task/DartTasks.kt b/buildSrc/src/main/kotlin/io/spine/gradle/dart/task/DartTasks.kt index 656177b3e..bc5e1e93e 100644 --- a/buildSrc/src/main/kotlin/io/spine/gradle/dart/task/DartTasks.kt +++ b/buildSrc/src/main/kotlin/io/spine/gradle/dart/task/DartTasks.kt @@ -1,5 +1,5 @@ /* - * 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. diff --git a/buildSrc/src/main/kotlin/io/spine/gradle/dart/task/IntegrationTest.kt b/buildSrc/src/main/kotlin/io/spine/gradle/dart/task/IntegrationTest.kt index 65ce4bb35..19f1f1471 100644 --- a/buildSrc/src/main/kotlin/io/spine/gradle/dart/task/IntegrationTest.kt +++ b/buildSrc/src/main/kotlin/io/spine/gradle/dart/task/IntegrationTest.kt @@ -1,5 +1,5 @@ /* - * 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. diff --git a/buildSrc/src/main/kotlin/io/spine/gradle/dart/task/Publish.kt b/buildSrc/src/main/kotlin/io/spine/gradle/dart/task/Publish.kt index d52799ffa..2f8df6b4c 100644 --- a/buildSrc/src/main/kotlin/io/spine/gradle/dart/task/Publish.kt +++ b/buildSrc/src/main/kotlin/io/spine/gradle/dart/task/Publish.kt @@ -1,5 +1,5 @@ /* - * 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. diff --git a/buildSrc/src/main/kotlin/io/spine/gradle/dokka/DokkaExtensions.kt b/buildSrc/src/main/kotlin/io/spine/gradle/dokka/DokkaExtensions.kt index 52ec7f30e..727a0793f 100644 --- a/buildSrc/src/main/kotlin/io/spine/gradle/dokka/DokkaExtensions.kt +++ b/buildSrc/src/main/kotlin/io/spine/gradle/dokka/DokkaExtensions.kt @@ -1,5 +1,5 @@ /* - * 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. diff --git a/buildSrc/src/main/kotlin/io/spine/gradle/dokka/TaskContainerExtensions.kt b/buildSrc/src/main/kotlin/io/spine/gradle/dokka/TaskContainerExtensions.kt index 39d9dfb92..02deead57 100644 --- a/buildSrc/src/main/kotlin/io/spine/gradle/dokka/TaskContainerExtensions.kt +++ b/buildSrc/src/main/kotlin/io/spine/gradle/dokka/TaskContainerExtensions.kt @@ -1,5 +1,5 @@ /* - * 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. diff --git a/buildSrc/src/main/kotlin/io/spine/gradle/fs/LazyTempPath.kt b/buildSrc/src/main/kotlin/io/spine/gradle/fs/LazyTempPath.kt index 3b3331805..f6e177717 100644 --- a/buildSrc/src/main/kotlin/io/spine/gradle/fs/LazyTempPath.kt +++ b/buildSrc/src/main/kotlin/io/spine/gradle/fs/LazyTempPath.kt @@ -1,5 +1,5 @@ /* - * 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. diff --git a/buildSrc/src/main/kotlin/io/spine/gradle/git/Branch.kt b/buildSrc/src/main/kotlin/io/spine/gradle/git/Branch.kt index 1883677f3..a10a65f81 100644 --- a/buildSrc/src/main/kotlin/io/spine/gradle/git/Branch.kt +++ b/buildSrc/src/main/kotlin/io/spine/gradle/git/Branch.kt @@ -1,5 +1,5 @@ /* - * 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. diff --git a/buildSrc/src/main/kotlin/io/spine/gradle/git/Repository.kt b/buildSrc/src/main/kotlin/io/spine/gradle/git/Repository.kt index 41a12b709..55ce67f0c 100644 --- a/buildSrc/src/main/kotlin/io/spine/gradle/git/Repository.kt +++ b/buildSrc/src/main/kotlin/io/spine/gradle/git/Repository.kt @@ -1,5 +1,5 @@ /* - * 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. diff --git a/buildSrc/src/main/kotlin/io/spine/gradle/git/UserInfo.kt b/buildSrc/src/main/kotlin/io/spine/gradle/git/UserInfo.kt index 43d8ab1a1..bc9f08d3a 100644 --- a/buildSrc/src/main/kotlin/io/spine/gradle/git/UserInfo.kt +++ b/buildSrc/src/main/kotlin/io/spine/gradle/git/UserInfo.kt @@ -1,5 +1,5 @@ /* - * 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. diff --git a/buildSrc/src/main/kotlin/io/spine/gradle/github/pages/AuthorEmail.kt b/buildSrc/src/main/kotlin/io/spine/gradle/github/pages/AuthorEmail.kt index 0a11eb120..f0d839f89 100644 --- a/buildSrc/src/main/kotlin/io/spine/gradle/github/pages/AuthorEmail.kt +++ b/buildSrc/src/main/kotlin/io/spine/gradle/github/pages/AuthorEmail.kt @@ -1,5 +1,5 @@ /* - * 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. 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 19021ae3d..ef67c71fd 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 @@ -1,5 +1,5 @@ /* - * 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. @@ -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/github/pages/SshKey.kt b/buildSrc/src/main/kotlin/io/spine/gradle/github/pages/SshKey.kt index 329e81114..186c47462 100644 --- a/buildSrc/src/main/kotlin/io/spine/gradle/github/pages/SshKey.kt +++ b/buildSrc/src/main/kotlin/io/spine/gradle/github/pages/SshKey.kt @@ -1,5 +1,5 @@ /* - * 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. diff --git a/buildSrc/src/main/kotlin/io/spine/gradle/github/pages/TaskName.kt b/buildSrc/src/main/kotlin/io/spine/gradle/github/pages/TaskName.kt index 77d4bc9e9..f5e3bfc81 100644 --- a/buildSrc/src/main/kotlin/io/spine/gradle/github/pages/TaskName.kt +++ b/buildSrc/src/main/kotlin/io/spine/gradle/github/pages/TaskName.kt @@ -1,5 +1,5 @@ /* - * 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. diff --git a/buildSrc/src/main/kotlin/io/spine/gradle/github/pages/Update.kt b/buildSrc/src/main/kotlin/io/spine/gradle/github/pages/Update.kt index cfcec7094..0f9a0f5cf 100644 --- a/buildSrc/src/main/kotlin/io/spine/gradle/github/pages/Update.kt +++ b/buildSrc/src/main/kotlin/io/spine/gradle/github/pages/Update.kt @@ -1,5 +1,5 @@ /* - * 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. diff --git a/buildSrc/src/main/kotlin/io/spine/gradle/github/pages/UpdateGitHubPages.kt b/buildSrc/src/main/kotlin/io/spine/gradle/github/pages/UpdateGitHubPages.kt index bd1a1b28a..e46a565f8 100644 --- a/buildSrc/src/main/kotlin/io/spine/gradle/github/pages/UpdateGitHubPages.kt +++ b/buildSrc/src/main/kotlin/io/spine/gradle/github/pages/UpdateGitHubPages.kt @@ -1,5 +1,5 @@ /* - * 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. diff --git a/buildSrc/src/main/kotlin/io/spine/gradle/github/pages/UpdateGitHubPagesExtension.kt b/buildSrc/src/main/kotlin/io/spine/gradle/github/pages/UpdateGitHubPagesExtension.kt index 6ead318e3..90eebc2f6 100644 --- a/buildSrc/src/main/kotlin/io/spine/gradle/github/pages/UpdateGitHubPagesExtension.kt +++ b/buildSrc/src/main/kotlin/io/spine/gradle/github/pages/UpdateGitHubPagesExtension.kt @@ -1,5 +1,5 @@ /* - * 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. diff --git a/buildSrc/src/main/kotlin/io/spine/gradle/java/Tasks.kt b/buildSrc/src/main/kotlin/io/spine/gradle/java/Tasks.kt index e08e64aa2..12d4d56cf 100644 --- a/buildSrc/src/main/kotlin/io/spine/gradle/java/Tasks.kt +++ b/buildSrc/src/main/kotlin/io/spine/gradle/java/Tasks.kt @@ -1,5 +1,5 @@ /* - * 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. 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 511791c1b..84c6bcb98 100644 --- a/buildSrc/src/main/kotlin/io/spine/gradle/javac/ErrorProne.kt +++ b/buildSrc/src/main/kotlin/io/spine/gradle/javac/ErrorProne.kt @@ -1,5 +1,5 @@ /* - * 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. @@ -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/javac/Javac.kt b/buildSrc/src/main/kotlin/io/spine/gradle/javac/Javac.kt index 933f5dae6..44223cb61 100644 --- a/buildSrc/src/main/kotlin/io/spine/gradle/javac/Javac.kt +++ b/buildSrc/src/main/kotlin/io/spine/gradle/javac/Javac.kt @@ -1,5 +1,5 @@ /* - * 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. diff --git a/buildSrc/src/main/kotlin/io/spine/gradle/javadoc/Encoding.kt b/buildSrc/src/main/kotlin/io/spine/gradle/javadoc/Encoding.kt index 8ae089bb3..052a1aabe 100644 --- a/buildSrc/src/main/kotlin/io/spine/gradle/javadoc/Encoding.kt +++ b/buildSrc/src/main/kotlin/io/spine/gradle/javadoc/Encoding.kt @@ -1,5 +1,5 @@ /* - * 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. diff --git a/buildSrc/src/main/kotlin/io/spine/gradle/javadoc/ExcludeInternalDoclet.kt b/buildSrc/src/main/kotlin/io/spine/gradle/javadoc/ExcludeInternalDoclet.kt index 48da884d8..541504c11 100644 --- a/buildSrc/src/main/kotlin/io/spine/gradle/javadoc/ExcludeInternalDoclet.kt +++ b/buildSrc/src/main/kotlin/io/spine/gradle/javadoc/ExcludeInternalDoclet.kt @@ -1,5 +1,5 @@ /* - * 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. 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 8f1a7f25d..9616e99e2 100644 --- a/buildSrc/src/main/kotlin/io/spine/gradle/javadoc/JavadocConfig.kt +++ b/buildSrc/src/main/kotlin/io/spine/gradle/javadoc/JavadocConfig.kt @@ -1,5 +1,5 @@ /* - * 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. @@ -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/javadoc/JavadocTag.kt b/buildSrc/src/main/kotlin/io/spine/gradle/javadoc/JavadocTag.kt index ec81567db..a6224a533 100644 --- a/buildSrc/src/main/kotlin/io/spine/gradle/javadoc/JavadocTag.kt +++ b/buildSrc/src/main/kotlin/io/spine/gradle/javadoc/JavadocTag.kt @@ -1,5 +1,5 @@ /* - * 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. 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 06a681b82..ec5d87263 100644 --- a/buildSrc/src/main/kotlin/io/spine/gradle/javascript/JsContext.kt +++ b/buildSrc/src/main/kotlin/io/spine/gradle/javascript/JsContext.kt @@ -1,5 +1,5 @@ /* - * 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. @@ -28,6 +28,8 @@ package io.spine.gradle.javascript import java.io.File import org.gradle.api.Project +import org.gradle.kotlin.dsl.support.serviceOf +import org.gradle.process.ExecOperations /** * Provides access to the current [JsEnvironment] and shortcuts for running `npm` tool. @@ -47,8 +49,7 @@ open class JsContext(jsEnv: JsEnvironment, internal val project: Project) * * This [File] is used as a working directory. */ - fun File.npm(vararg args: String) = project.exec { - + fun File.npm(vararg args: String) = project.serviceOf().exec { workingDir(this@npm) commandLine(npmExecutable) args(*args) diff --git a/buildSrc/src/main/kotlin/io/spine/gradle/javascript/JsEnvironment.kt b/buildSrc/src/main/kotlin/io/spine/gradle/javascript/JsEnvironment.kt index 38cc64905..c2dc68e41 100644 --- a/buildSrc/src/main/kotlin/io/spine/gradle/javascript/JsEnvironment.kt +++ b/buildSrc/src/main/kotlin/io/spine/gradle/javascript/JsEnvironment.kt @@ -1,5 +1,5 @@ /* - * 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. diff --git a/buildSrc/src/main/kotlin/io/spine/gradle/javascript/JsExtension.kt b/buildSrc/src/main/kotlin/io/spine/gradle/javascript/JsExtension.kt index d59379964..69c3e2638 100644 --- a/buildSrc/src/main/kotlin/io/spine/gradle/javascript/JsExtension.kt +++ b/buildSrc/src/main/kotlin/io/spine/gradle/javascript/JsExtension.kt @@ -1,5 +1,5 @@ /* - * 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. diff --git a/buildSrc/src/main/kotlin/io/spine/gradle/javascript/plugin/Idea.kt b/buildSrc/src/main/kotlin/io/spine/gradle/javascript/plugin/Idea.kt index 06a112aa2..087dd2556 100644 --- a/buildSrc/src/main/kotlin/io/spine/gradle/javascript/plugin/Idea.kt +++ b/buildSrc/src/main/kotlin/io/spine/gradle/javascript/plugin/Idea.kt @@ -1,5 +1,5 @@ /* - * 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. diff --git a/buildSrc/src/main/kotlin/io/spine/gradle/javascript/plugin/JsPlugins.kt b/buildSrc/src/main/kotlin/io/spine/gradle/javascript/plugin/JsPlugins.kt index 6e007df18..b478f649a 100644 --- a/buildSrc/src/main/kotlin/io/spine/gradle/javascript/plugin/JsPlugins.kt +++ b/buildSrc/src/main/kotlin/io/spine/gradle/javascript/plugin/JsPlugins.kt @@ -1,5 +1,5 @@ /* - * 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. diff --git a/buildSrc/src/main/kotlin/io/spine/gradle/javascript/plugin/McJs.kt b/buildSrc/src/main/kotlin/io/spine/gradle/javascript/plugin/McJs.kt index dbc5c42e8..2efa4a432 100644 --- a/buildSrc/src/main/kotlin/io/spine/gradle/javascript/plugin/McJs.kt +++ b/buildSrc/src/main/kotlin/io/spine/gradle/javascript/plugin/McJs.kt @@ -1,5 +1,5 @@ /* - * 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. diff --git a/buildSrc/src/main/kotlin/io/spine/gradle/javascript/plugin/Protobuf.kt b/buildSrc/src/main/kotlin/io/spine/gradle/javascript/plugin/Protobuf.kt index 178db2492..c1c2d6480 100644 --- a/buildSrc/src/main/kotlin/io/spine/gradle/javascript/plugin/Protobuf.kt +++ b/buildSrc/src/main/kotlin/io/spine/gradle/javascript/plugin/Protobuf.kt @@ -1,5 +1,5 @@ /* - * 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. @@ -50,8 +50,6 @@ fun JsPlugins.protobuf() { val protobufExt = project.extensions.getByType(ProtobufExtension::class.java) protobufExt.apply { - generatedFilesBaseDir = projectDir.path - protoc { artifact = Protobuf.compiler } diff --git a/buildSrc/src/main/kotlin/io/spine/gradle/javascript/task/Assemble.kt b/buildSrc/src/main/kotlin/io/spine/gradle/javascript/task/Assemble.kt index b5ac3f090..4b57a4e98 100644 --- a/buildSrc/src/main/kotlin/io/spine/gradle/javascript/task/Assemble.kt +++ b/buildSrc/src/main/kotlin/io/spine/gradle/javascript/task/Assemble.kt @@ -1,5 +1,5 @@ /* - * 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. diff --git a/buildSrc/src/main/kotlin/io/spine/gradle/javascript/task/Check.kt b/buildSrc/src/main/kotlin/io/spine/gradle/javascript/task/Check.kt index 7a87f789d..d25c3c217 100644 --- a/buildSrc/src/main/kotlin/io/spine/gradle/javascript/task/Check.kt +++ b/buildSrc/src/main/kotlin/io/spine/gradle/javascript/task/Check.kt @@ -1,5 +1,5 @@ /* - * 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. diff --git a/buildSrc/src/main/kotlin/io/spine/gradle/javascript/task/Clean.kt b/buildSrc/src/main/kotlin/io/spine/gradle/javascript/task/Clean.kt index 727553ea6..c5ff83548 100644 --- a/buildSrc/src/main/kotlin/io/spine/gradle/javascript/task/Clean.kt +++ b/buildSrc/src/main/kotlin/io/spine/gradle/javascript/task/Clean.kt @@ -1,5 +1,5 @@ /* - * 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. diff --git a/buildSrc/src/main/kotlin/io/spine/gradle/javascript/task/IntegrationTest.kt b/buildSrc/src/main/kotlin/io/spine/gradle/javascript/task/IntegrationTest.kt index a8a61116b..227e33edb 100644 --- a/buildSrc/src/main/kotlin/io/spine/gradle/javascript/task/IntegrationTest.kt +++ b/buildSrc/src/main/kotlin/io/spine/gradle/javascript/task/IntegrationTest.kt @@ -1,5 +1,5 @@ /* - * 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. diff --git a/buildSrc/src/main/kotlin/io/spine/gradle/javascript/task/JsTasks.kt b/buildSrc/src/main/kotlin/io/spine/gradle/javascript/task/JsTasks.kt index 7d7f709ce..3cf633585 100644 --- a/buildSrc/src/main/kotlin/io/spine/gradle/javascript/task/JsTasks.kt +++ b/buildSrc/src/main/kotlin/io/spine/gradle/javascript/task/JsTasks.kt @@ -1,5 +1,5 @@ /* - * 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. diff --git a/buildSrc/src/main/kotlin/io/spine/gradle/javascript/task/LicenseReport.kt b/buildSrc/src/main/kotlin/io/spine/gradle/javascript/task/LicenseReport.kt index a06ff01c5..c3b3a6ad8 100644 --- a/buildSrc/src/main/kotlin/io/spine/gradle/javascript/task/LicenseReport.kt +++ b/buildSrc/src/main/kotlin/io/spine/gradle/javascript/task/LicenseReport.kt @@ -1,5 +1,5 @@ /* - * 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. diff --git a/buildSrc/src/main/kotlin/io/spine/gradle/javascript/task/Publish.kt b/buildSrc/src/main/kotlin/io/spine/gradle/javascript/task/Publish.kt index 9f9d57088..7d1baeae1 100644 --- a/buildSrc/src/main/kotlin/io/spine/gradle/javascript/task/Publish.kt +++ b/buildSrc/src/main/kotlin/io/spine/gradle/javascript/task/Publish.kt @@ -1,5 +1,5 @@ /* - * 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. diff --git a/buildSrc/src/main/kotlin/io/spine/gradle/javascript/task/Webpack.kt b/buildSrc/src/main/kotlin/io/spine/gradle/javascript/task/Webpack.kt index 54b69ebcd..7c82ad7a2 100644 --- a/buildSrc/src/main/kotlin/io/spine/gradle/javascript/task/Webpack.kt +++ b/buildSrc/src/main/kotlin/io/spine/gradle/javascript/task/Webpack.kt @@ -1,5 +1,5 @@ /* - * 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. 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 b27b901f0..65cdebd5c 100644 --- a/buildSrc/src/main/kotlin/io/spine/gradle/kotlin/KotlinConfig.kt +++ b/buildSrc/src/main/kotlin/io/spine/gradle/kotlin/KotlinConfig.kt @@ -1,5 +1,5 @@ /* - * 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. @@ -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,24 +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. - // See: https://youtrack.jetbrains.com/issue/KT-61573 - val expectActualClasses = - if (KotlinVersion.CURRENT.isAtLeast(1, 9, 20)) "-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 d9928807b..4e2e24a64 100644 --- a/buildSrc/src/main/kotlin/io/spine/gradle/protobuf/ProtoTaskExtensions.kt +++ b/buildSrc/src/main/kotlin/io/spine/gradle/protobuf/ProtoTaskExtensions.kt @@ -1,5 +1,5 @@ /* - * 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. @@ -24,28 +24,36 @@ * 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.dsl.KotlinCompile +import org.jetbrains.kotlin.gradle.tasks.KotlinCompilationTask import titleCaseFirstChar /** - * Obtains the name of the `generated` directory under the project root directory. + * Obtains the path of the `generated` directory under the project root directory. */ -private val Project.generatedDir: String - get() = "${projectDir}/generated" +private val Project.generatedDir: Path + get() = projectDir.resolve("generated").toPath() /** * Obtains the `generated` directory for the source set of the task. @@ -58,14 +66,14 @@ private fun GenerateProtoTask.generatedDir(language: String = ""): File { } /** - * Configures protobuf code generation task for the code which cannot use Spine Model Compiler - * (e.g. the `base` project). + * 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. Generation of descriptor set file is turned on for each source set. + * 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. @@ -78,10 +86,8 @@ private fun GenerateProtoTask.generatedDir(language: String = ""): File { * The usage of this extension in a module build file would be: * ``` * protobuf { - * generateProtoTasks { - * for (task in all()) { - * task.setup() - * } + * generateProtoTasks.all().configureEach { + * setup() * } * } * ``` @@ -103,35 +109,38 @@ private fun GenerateProtoTask.generatedDir(language: String = ""): File { fun GenerateProtoTask.setup() { builtins.maybeCreate("kotlin") setupDescriptorSetFileCreation() + doFirst { + excludeProtocOutput() + } doLast { copyGeneratedFiles() } - excludeProtocOutput() setupKotlinCompile() dependOnProcessResourcesTask() - configureIdeaDirs() + 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 per project's Maven coordinates. + * 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 in order to allow other Spine libraries - * to locate and load the generated descriptor set files properly. + * 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, + * 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.*/) -private fun GenerateProtoTask.setupDescriptorSetFileCreation() { - // Tell `protoc` generate descriptor set file. - // The name of the generated file reflects project's Maven coordinates. + "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 @@ -143,7 +152,7 @@ private fun GenerateProtoTask.setupDescriptorSetFileCreation() { includeSourceInfo = true } - // Make the descriptor set file included into the resources. + // Add the descriptor set file into the resources. project.sourceSets.named(ssn) { resources.srcDirs(descriptorsDir) } @@ -167,7 +176,7 @@ private fun GenerateProtoTask.setupDescriptorSetFileCreation() { * 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. + * The returned value is just a file name and does not contain a file path. */ private fun Project.descriptorSetName(sourceSet: SourceSet) = arrayOf( @@ -220,7 +229,7 @@ private fun GenerateProtoTask.deleteComGoogle(language: String) { * Exclude [GenerateProtoTask.outputBaseDir] from Java source set directories to avoid * duplicated source code files. */ -private fun GenerateProtoTask.excludeProtocOutput() { +fun GenerateProtoTask.excludeProtocOutput() { val protocOutputDir = File(outputBaseDir).parentFile val java: SourceDirectorySet = sourceSet.java @@ -228,6 +237,8 @@ private fun GenerateProtoTask.excludeProtocOutput() { val newSourceDirectories = java.sourceDirectories .filter { !it.residesIn(protocOutputDir) } .toSet() + // Make sure we start from scratch. + // Not doing this failed the following, real, assignment sometimes. java.setSrcDirs(listOf()) java.srcDirs(newSourceDirectories) @@ -239,8 +250,8 @@ private fun GenerateProtoTask.excludeProtocOutput() { /** * Make sure Kotlin compilation explicitly depends on this `GenerateProtoTask` to avoid racing. */ -private fun GenerateProtoTask.setupKotlinCompile() { - val kotlinCompile = project.kotlinCompileFor(sourceSet) +fun GenerateProtoTask.setupKotlinCompile() { + val kotlinCompile = project.kotlinCompilationTaskFor(sourceSet) kotlinCompile?.dependsOn(this) } @@ -253,7 +264,7 @@ private fun GenerateProtoTask.setupKotlinCompile() { * by Gradle during the build because Protobuf Gradle Plugin does not set * dependencies between `generateProto` and `processResources` tasks. */ -private fun GenerateProtoTask.dependOnProcessResourcesTask() { +fun GenerateProtoTask.dependOnProcessResourcesTask() { val processResources = processResourceTaskName(sourceSet.name) project.tasks[processResources].dependsOn(this) } @@ -268,78 +279,167 @@ 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 = canonicalFile.startsWith(directory.absolutePath) -private fun GenerateProtoTask.configureIdeaDirs() = project.plugins.withId("idea") { - val module = project.extensions.findByType(IdeaModel::class.java)!!.module - - // Make IDEA forget about sources under `outputBaseDir`. - val protocOutputDir = File(outputBaseDir).parentFile - module.generatedSourceDirs.removeIf { dir -> - dir.residesIn(protocOutputDir) +/** + * 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() + } + } } +} - module.sourceDirs.removeIf { dir -> - dir.residesIn(protocOutputDir) - } +/** + * 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) - val javaDir = generatedDir("java") - val kotlinDir = generatedDir("kotlin") - - // 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'. - project.tasks.withType(GenerateIdeaModule::class.java).forEach { - it.doFirst { - javaDir.mkdirs() - kotlinDir.mkdirs() +/** + * 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 } - if (isTest) { - module.testSources.run { - from(javaDir) - from(kotlinDir) - } - } else { - module.sourceDirs.run { - add(javaDir) - add(kotlinDir) +/** + * 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() } } +} - module.generatedSourceDirs.run { - add(javaDir) - add(kotlinDir) +/** + * 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) + } + /** - * Prints diagnostic output of `sourceDirs` and `generatedSourceDirs` of an [IdeaModule]. + * Excludes the given directory and its subdirectories from + * being seen as ones with the source code. * - * The warning `"unused"` is suppressed because this function is not used in - * the production mode. + * 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. */ -@Suppress("unused") -private fun IdeaModule.printSourceDirectories() { - println("**** [IDEA] Source directories:") - sourceDirs.forEach { println(it) } - println() - println("**** [IDEA] Generated source directories:") - generatedSourceDirs.forEach { println(it) } - println() +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/buildSrc/src/main/kotlin/io/spine/gradle/publish/CheckVersionIncrement.kt b/buildSrc/src/main/kotlin/io/spine/gradle/publish/CheckVersionIncrement.kt index 13dc7722f..56245ff32 100644 --- a/buildSrc/src/main/kotlin/io/spine/gradle/publish/CheckVersionIncrement.kt +++ b/buildSrc/src/main/kotlin/io/spine/gradle/publish/CheckVersionIncrement.kt @@ -1,5 +1,5 @@ /* - * 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. @@ -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) } } @@ -70,8 +71,9 @@ open class CheckVersionIncrement : DefaultTask() { val versions = metadata?.versioning?.versions val versionExists = versions?.contains(version) ?: false if (versionExists) { - throw GradleException(""" - Version `$version` is already published to maven repository `$repoUrl`. + throw GradleException( + """ + The version `$version` is already published to the Maven repository `$repoUrl`. Try incrementing the library version. All available versions are: ${versions?.joinToString(separator = ", ")}. @@ -88,13 +90,28 @@ open class CheckVersionIncrement : DefaultTask() { private fun Project.artifactPath(): String { val group = this.group as String - val name = "spine-${this.name}" + val name = "${artifactPrefix()}${this.name}" val pathElements = ArrayList(group.split('.')) pathElements.add(name) val path = pathElements.joinToString(separator = "/") return path } + + /** + * Returns the artifact prefix used for the publishing of this project. + * + * All current Spine modules should be using `SpinePublishing`. + * Therefore, the corresponding extension should be present in the root project. + * However, just in case, we define the "standard" prefix here as well. + * + * This value MUST be the same as defined by the defaults in `SpinePublishing`. + */ + private fun Project.artifactPrefix(): String { + val ext = rootProject.extensions.findByType(SpinePublishing::class.java) + val result = ext?.artifactPrefix ?: SpinePublishing.DEFAULT_PREFIX + return result + } } private data class MavenMetadata(var versioning: Versioning = Versioning()) { @@ -119,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 37f6f23c8..67716d89c 100644 --- a/buildSrc/src/main/kotlin/io/spine/gradle/publish/CloudArtifactRegistry.kt +++ b/buildSrc/src/main/kotlin/io/spine/gradle/publish/CloudArtifactRegistry.kt @@ -1,5 +1,5 @@ /* - * 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. @@ -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 e918ca5b4..624f5cb43 100644 --- a/buildSrc/src/main/kotlin/io/spine/gradle/publish/CloudRepo.kt +++ b/buildSrc/src/main/kotlin/io/spine/gradle/publish/CloudRepo.kt @@ -1,5 +1,5 @@ /* - * 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. @@ -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 - * public repository, and publishing via 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 000000000..152455dc3 --- /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 3250bc264..df326b85d 100644 --- a/buildSrc/src/main/kotlin/io/spine/gradle/publish/GitHubPackages.kt +++ b/buildSrc/src/main/kotlin/io/spine/gradle/publish/GitHubPackages.kt @@ -1,5 +1,5 @@ /* - * 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. @@ -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/IncrementGuard.kt b/buildSrc/src/main/kotlin/io/spine/gradle/publish/IncrementGuard.kt index dbb69a730..b6683faf9 100644 --- a/buildSrc/src/main/kotlin/io/spine/gradle/publish/IncrementGuard.kt +++ b/buildSrc/src/main/kotlin/io/spine/gradle/publish/IncrementGuard.kt @@ -1,5 +1,5 @@ /* - * 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. diff --git a/buildSrc/src/main/kotlin/io/spine/gradle/publish/JarDsl.kt b/buildSrc/src/main/kotlin/io/spine/gradle/publish/JarDsl.kt index 8fe607168..137118432 100644 --- a/buildSrc/src/main/kotlin/io/spine/gradle/publish/JarDsl.kt +++ b/buildSrc/src/main/kotlin/io/spine/gradle/publish/JarDsl.kt @@ -1,5 +1,5 @@ /* - * 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. diff --git a/buildSrc/src/main/kotlin/io/spine/gradle/publish/ProtoExts.kt b/buildSrc/src/main/kotlin/io/spine/gradle/publish/ProtoExts.kt index 5b50fab5a..874b7f996 100644 --- a/buildSrc/src/main/kotlin/io/spine/gradle/publish/ProtoExts.kt +++ b/buildSrc/src/main/kotlin/io/spine/gradle/publish/ProtoExts.kt @@ -1,5 +1,5 @@ /* - * 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. 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 000000000..75c5413a0 --- /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 1ebe17de3..000000000 --- a/buildSrc/src/main/kotlin/io/spine/gradle/publish/Publications.kt +++ /dev/null @@ -1,234 +0,0 @@ -/* - * Copyright 2024, 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 d85885f42..0a24b56b8 100644 --- a/buildSrc/src/main/kotlin/io/spine/gradle/publish/PublishingExts.kt +++ b/buildSrc/src/main/kotlin/io/spine/gradle/publish/PublishingExts.kt @@ -1,5 +1,5 @@ /* - * 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. @@ -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 41cc101a1..eea6dc190 100644 --- a/buildSrc/src/main/kotlin/io/spine/gradle/publish/PublishingRepos.kt +++ b/buildSrc/src/main/kotlin/io/spine/gradle/publish/PublishingRepos.kt @@ -1,5 +1,5 @@ /* - * 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. @@ -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/ShadowJarExts.kt b/buildSrc/src/main/kotlin/io/spine/gradle/publish/ShadowJarExts.kt new file mode 100644 index 000000000..e2e67e042 --- /dev/null +++ b/buildSrc/src/main/kotlin/io/spine/gradle/publish/ShadowJarExts.kt @@ -0,0 +1,77 @@ +/* + * 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 com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar + +/** + * Calls [ShadowJar.mergeServiceFiles] for the files we use in the Spine SDK. + */ +fun ShadowJar.handleMergingServiceFiles() { + ServiceFiles.all.forEach { + mergeServiceFiles(it) + } +} + +@Suppress("ConstPropertyName") +private object ServiceFiles { + + /** + * Files containing references to descriptor set files. + */ + private const val descriptorSetReferences = "desc.ref" + + private const val servicesDir = "META-INF/services" + /** + * Providers of custom Protobuf options introduced by the libraries. + */ + private const val optionProviders = "$servicesDir/io.spine.option.OptionsProvider" + + /** + * KSP symbol processor provider. + */ + private const val kspSymbolProcessorProviders = + "$servicesDir/com.google.devtools.ksp.KspSymbolProcessorProvider" + + /** + * Message routing setup classes generated by the Compiler for JVM. + */ + private const val routeSetupPackage = "io.spine.server.route.setup" + private const val routeSetupPrefix = "$servicesDir/$routeSetupPackage" + private const val commandRoutingSetupClasses = "$routeSetupPrefix.CommandRoutingSetup" + private const val eventRoutingSetupClasses = "$routeSetupPrefix.EventRoutingSetup" + private const val stateRoutingSetupClasses = "$routeSetupPrefix.StateRoutingSetup" + + val all = arrayOf( + descriptorSetReferences, + optionProviders, + kspSymbolProcessorProviders, + commandRoutingSetupClasses, + eventRoutingSetupClasses, + stateRoutingSetupClasses + ) +} 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 f3218ef0b..9dc7d7c90 100644 --- a/buildSrc/src/main/kotlin/io/spine/gradle/publish/SpinePublishing.kt +++ b/buildSrc/src/main/kotlin/io/spine/gradle/publish/SpinePublishing.kt @@ -1,5 +1,5 @@ /* - * Copyright 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. @@ -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. + * + * ## Published artifacts * - * By default, along with the compilation output of "main" source set, the extension publishes + * 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,16 +162,32 @@ 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. * - * @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. + * 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 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 */ open class SpinePublishing(private val project: Project) { + companion object { + + /** + * The default prefix added before a module name when publishing artifacts. + */ + const val DEFAULT_PREFIX = "spine-" + } + private val protoJar = ProtoJar() private val testJar = TestJar() private val dokkaJar = DokkaJar() @@ -155,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. + * + * Default value is `false`. * - * If `true`, the module should configure publications on its own. - * Otherwise, the extension will configure standard [ones][StandardJavaPublicationHandler]. + * 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 @@ -183,24 +243,22 @@ 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. - * - * The default value is "spine-". */ - var artifactPrefix: String = "spine-" + var artifactPrefix: String = DEFAULT_PREFIX /** * Allows disabling publishing of [protoJar] artifact, containing all Proto sources @@ -208,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", @@ -232,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: * * ``` @@ -271,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") @@ -304,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) @@ -361,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. * @@ -400,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." + ) } } @@ -425,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 000000000..06d78c100 --- /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/repo/Credentials.kt b/buildSrc/src/main/kotlin/io/spine/gradle/repo/Credentials.kt new file mode 100644 index 000000000..1624b389a --- /dev/null +++ b/buildSrc/src/main/kotlin/io/spine/gradle/repo/Credentials.kt @@ -0,0 +1,35 @@ +/* + * 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 + +/** + * Password credentials for a Maven repository. + */ +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 92% rename from buildSrc/src/main/kotlin/io/spine/gradle/RepoSlug.kt rename to buildSrc/src/main/kotlin/io/spine/gradle/repo/RepoSlug.kt index d7949a70f..461c690e4 100644 --- a/buildSrc/src/main/kotlin/io/spine/gradle/RepoSlug.kt +++ b/buildSrc/src/main/kotlin/io/spine/gradle/repo/RepoSlug.kt @@ -1,5 +1,5 @@ /* - * 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. @@ -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 000000000..43abe47c6 --- /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 000000000..a586ffdb9 --- /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 59459d3d3..efdf6059b 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 @@ -1,5 +1,5 @@ /* - * 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. @@ -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/FileExtension.kt b/buildSrc/src/main/kotlin/io/spine/gradle/report/coverage/FileExtension.kt index ddd6e9fdf..ae4734c11 100644 --- a/buildSrc/src/main/kotlin/io/spine/gradle/report/coverage/FileExtension.kt +++ b/buildSrc/src/main/kotlin/io/spine/gradle/report/coverage/FileExtension.kt @@ -1,5 +1,5 @@ /* - * 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. diff --git a/buildSrc/src/main/kotlin/io/spine/gradle/report/coverage/FileExtensions.kt b/buildSrc/src/main/kotlin/io/spine/gradle/report/coverage/FileExtensions.kt index 88d3f4094..89c87890d 100644 --- a/buildSrc/src/main/kotlin/io/spine/gradle/report/coverage/FileExtensions.kt +++ b/buildSrc/src/main/kotlin/io/spine/gradle/report/coverage/FileExtensions.kt @@ -1,5 +1,5 @@ /* - * 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. diff --git a/buildSrc/src/main/kotlin/io/spine/gradle/report/coverage/FileFilter.kt b/buildSrc/src/main/kotlin/io/spine/gradle/report/coverage/FileFilter.kt index aa30c8a93..5b26cc7a6 100644 --- a/buildSrc/src/main/kotlin/io/spine/gradle/report/coverage/FileFilter.kt +++ b/buildSrc/src/main/kotlin/io/spine/gradle/report/coverage/FileFilter.kt @@ -1,5 +1,5 @@ /* - * 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. 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 826de01d0..5114add75 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 @@ -1,5 +1,5 @@ /* - * 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. @@ -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/coverage/PathMarker.kt b/buildSrc/src/main/kotlin/io/spine/gradle/report/coverage/PathMarker.kt index 25d81fe12..26bb13564 100644 --- a/buildSrc/src/main/kotlin/io/spine/gradle/report/coverage/PathMarker.kt +++ b/buildSrc/src/main/kotlin/io/spine/gradle/report/coverage/PathMarker.kt @@ -1,5 +1,5 @@ /* - * 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. diff --git a/buildSrc/src/main/kotlin/io/spine/gradle/report/coverage/TaskName.kt b/buildSrc/src/main/kotlin/io/spine/gradle/report/coverage/TaskName.kt index 26ae433c0..7c0e386dd 100644 --- a/buildSrc/src/main/kotlin/io/spine/gradle/report/coverage/TaskName.kt +++ b/buildSrc/src/main/kotlin/io/spine/gradle/report/coverage/TaskName.kt @@ -1,5 +1,5 @@ /* - * 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. diff --git a/buildSrc/src/main/kotlin/io/spine/gradle/report/license/Configuration.kt b/buildSrc/src/main/kotlin/io/spine/gradle/report/license/Configuration.kt index dbc8f4305..f6e06fdd2 100644 --- a/buildSrc/src/main/kotlin/io/spine/gradle/report/license/Configuration.kt +++ b/buildSrc/src/main/kotlin/io/spine/gradle/report/license/Configuration.kt @@ -1,5 +1,5 @@ /* - * 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. 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 ed7fd9688..ec86eb582 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 @@ -1,5 +1,5 @@ /* - * 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. @@ -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/license/MarkdownReportRenderer.kt b/buildSrc/src/main/kotlin/io/spine/gradle/report/license/MarkdownReportRenderer.kt index 5eecfe609..b15821043 100644 --- a/buildSrc/src/main/kotlin/io/spine/gradle/report/license/MarkdownReportRenderer.kt +++ b/buildSrc/src/main/kotlin/io/spine/gradle/report/license/MarkdownReportRenderer.kt @@ -1,5 +1,5 @@ /* - * 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. diff --git a/buildSrc/src/main/kotlin/io/spine/gradle/report/license/ModuleDataExtensions.kt b/buildSrc/src/main/kotlin/io/spine/gradle/report/license/ModuleDataExtensions.kt index fc735a857..0aca30fae 100644 --- a/buildSrc/src/main/kotlin/io/spine/gradle/report/license/ModuleDataExtensions.kt +++ b/buildSrc/src/main/kotlin/io/spine/gradle/report/license/ModuleDataExtensions.kt @@ -1,5 +1,5 @@ /* - * 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. diff --git a/buildSrc/src/main/kotlin/io/spine/gradle/report/license/Paths.kt b/buildSrc/src/main/kotlin/io/spine/gradle/report/license/Paths.kt index 4a4fa2297..975a73b0e 100644 --- a/buildSrc/src/main/kotlin/io/spine/gradle/report/license/Paths.kt +++ b/buildSrc/src/main/kotlin/io/spine/gradle/report/license/Paths.kt @@ -1,5 +1,5 @@ /* - * 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. diff --git a/buildSrc/src/main/kotlin/io/spine/gradle/report/license/ProjectDependencies.kt b/buildSrc/src/main/kotlin/io/spine/gradle/report/license/ProjectDependencies.kt index c1c18c27e..d9e569cb1 100644 --- a/buildSrc/src/main/kotlin/io/spine/gradle/report/license/ProjectDependencies.kt +++ b/buildSrc/src/main/kotlin/io/spine/gradle/report/license/ProjectDependencies.kt @@ -1,5 +1,5 @@ /* - * 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. diff --git a/buildSrc/src/main/kotlin/io/spine/gradle/report/license/Tasks.kt b/buildSrc/src/main/kotlin/io/spine/gradle/report/license/Tasks.kt index f88a58c87..05df91adb 100644 --- a/buildSrc/src/main/kotlin/io/spine/gradle/report/license/Tasks.kt +++ b/buildSrc/src/main/kotlin/io/spine/gradle/report/license/Tasks.kt @@ -1,5 +1,5 @@ /* - * 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. diff --git a/buildSrc/src/main/kotlin/io/spine/gradle/report/license/Template.kt b/buildSrc/src/main/kotlin/io/spine/gradle/report/license/Template.kt index e758bee6f..adda37b84 100644 --- a/buildSrc/src/main/kotlin/io/spine/gradle/report/license/Template.kt +++ b/buildSrc/src/main/kotlin/io/spine/gradle/report/license/Template.kt @@ -1,5 +1,5 @@ /* - * 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. diff --git a/buildSrc/src/main/kotlin/io/spine/gradle/report/pom/DependencyScope.kt b/buildSrc/src/main/kotlin/io/spine/gradle/report/pom/DependencyScope.kt index cbe860ece..1b4f47835 100644 --- a/buildSrc/src/main/kotlin/io/spine/gradle/report/pom/DependencyScope.kt +++ b/buildSrc/src/main/kotlin/io/spine/gradle/report/pom/DependencyScope.kt @@ -1,5 +1,5 @@ /* - * 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. 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 a758ecfd8..eda249365 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 @@ -1,5 +1,5 @@ /* - * 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. @@ -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/InceptionYear.kt b/buildSrc/src/main/kotlin/io/spine/gradle/report/pom/InceptionYear.kt index 2e6894202..cb25b3d68 100644 --- a/buildSrc/src/main/kotlin/io/spine/gradle/report/pom/InceptionYear.kt +++ b/buildSrc/src/main/kotlin/io/spine/gradle/report/pom/InceptionYear.kt @@ -1,5 +1,5 @@ /* - * 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. diff --git a/buildSrc/src/main/kotlin/io/spine/gradle/report/pom/MarkupExtensions.kt b/buildSrc/src/main/kotlin/io/spine/gradle/report/pom/MarkupExtensions.kt index 750452d32..0612f2e42 100644 --- a/buildSrc/src/main/kotlin/io/spine/gradle/report/pom/MarkupExtensions.kt +++ b/buildSrc/src/main/kotlin/io/spine/gradle/report/pom/MarkupExtensions.kt @@ -1,5 +1,5 @@ /* - * 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. 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 4750db5b1..3d72de1cd 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 @@ -1,5 +1,5 @@ /* - * 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. @@ -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/PomFormatting.kt b/buildSrc/src/main/kotlin/io/spine/gradle/report/pom/PomFormatting.kt index ddd284c1e..ba673bb40 100644 --- a/buildSrc/src/main/kotlin/io/spine/gradle/report/pom/PomFormatting.kt +++ b/buildSrc/src/main/kotlin/io/spine/gradle/report/pom/PomFormatting.kt @@ -1,5 +1,5 @@ /* - * 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. 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 ff70b82fa..9a4072572 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 @@ -1,5 +1,5 @@ /* - * 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. @@ -68,27 +68,31 @@ 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) } - val task = project.tasks.create("generatePom") - task.doLast { - val pomFile = project.projectDir.resolve("pom.xml") - project.delete(pomFile) + val task = project.tasks.register("generatePom") { + doLast { + val pomFile = project.projectDir.resolve("pom.xml") + project.delete(pomFile) - val projectData = project.metadata() - val writer = PomXmlWriter(projectData) - writer.writeTo(pomFile) + val projectData = project.metadata() + val writer = PomXmlWriter(projectData) + writer.writeTo(pomFile) + } + + val assembleTask = project.tasks.findByName("assemble")!! + dependsOn(assembleTask) } val buildTask = project.tasks.findByName("build")!! buildTask.finalizedBy(task) - - val assembleTask = project.tasks.findByName("assemble")!! - task.dependsOn(assembleTask) } } diff --git a/buildSrc/src/main/kotlin/io/spine/gradle/report/pom/PomXmlWriter.kt b/buildSrc/src/main/kotlin/io/spine/gradle/report/pom/PomXmlWriter.kt index ccb5f3169..53122196a 100644 --- a/buildSrc/src/main/kotlin/io/spine/gradle/report/pom/PomXmlWriter.kt +++ b/buildSrc/src/main/kotlin/io/spine/gradle/report/pom/PomXmlWriter.kt @@ -1,5 +1,5 @@ /* - * 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. diff --git a/buildSrc/src/main/kotlin/io/spine/gradle/report/pom/ProjectMetadata.kt b/buildSrc/src/main/kotlin/io/spine/gradle/report/pom/ProjectMetadata.kt index b1e4e8a7d..ffb89a263 100644 --- a/buildSrc/src/main/kotlin/io/spine/gradle/report/pom/ProjectMetadata.kt +++ b/buildSrc/src/main/kotlin/io/spine/gradle/report/pom/ProjectMetadata.kt @@ -1,5 +1,5 @@ /* - * 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. diff --git a/buildSrc/src/main/kotlin/io/spine/gradle/report/pom/ScopedDependency.kt b/buildSrc/src/main/kotlin/io/spine/gradle/report/pom/ScopedDependency.kt index 59a95cd76..7c67a32ca 100644 --- a/buildSrc/src/main/kotlin/io/spine/gradle/report/pom/ScopedDependency.kt +++ b/buildSrc/src/main/kotlin/io/spine/gradle/report/pom/ScopedDependency.kt @@ -1,5 +1,5 @@ /* - * 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. diff --git a/buildSrc/src/main/kotlin/io/spine/gradle/report/pom/SpineLicense.kt b/buildSrc/src/main/kotlin/io/spine/gradle/report/pom/SpineLicense.kt index 05addfb0f..114395e62 100644 --- a/buildSrc/src/main/kotlin/io/spine/gradle/report/pom/SpineLicense.kt +++ b/buildSrc/src/main/kotlin/io/spine/gradle/report/pom/SpineLicense.kt @@ -1,5 +1,5 @@ /* - * 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. diff --git a/buildSrc/src/main/kotlin/io/spine/gradle/testing/Logging.kt b/buildSrc/src/main/kotlin/io/spine/gradle/testing/Logging.kt index 1defd9e2f..6fb7eabca 100644 --- a/buildSrc/src/main/kotlin/io/spine/gradle/testing/Logging.kt +++ b/buildSrc/src/main/kotlin/io/spine/gradle/testing/Logging.kt @@ -1,5 +1,5 @@ /* - * 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. diff --git a/buildSrc/src/main/kotlin/io/spine/gradle/testing/Multiproject.kt b/buildSrc/src/main/kotlin/io/spine/gradle/testing/Multiproject.kt index 32a19ddd4..1f5ed4963 100644 --- a/buildSrc/src/main/kotlin/io/spine/gradle/testing/Multiproject.kt +++ b/buildSrc/src/main/kotlin/io/spine/gradle/testing/Multiproject.kt @@ -1,5 +1,5 @@ /* - * 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. 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 7991450df..30ac810ea 100644 --- a/buildSrc/src/main/kotlin/io/spine/gradle/testing/Tasks.kt +++ b/buildSrc/src/main/kotlin/io/spine/gradle/testing/Tasks.kt @@ -1,5 +1,5 @@ /* - * 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. @@ -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 000000000..de7f1bfff --- /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/jacoco-kotlin-jvm.gradle.kts b/buildSrc/src/main/kotlin/jacoco-kotlin-jvm.gradle.kts index 353802411..48fb126e9 100644 --- a/buildSrc/src/main/kotlin/jacoco-kotlin-jvm.gradle.kts +++ b/buildSrc/src/main/kotlin/jacoco-kotlin-jvm.gradle.kts @@ -1,5 +1,5 @@ /* - * 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. diff --git a/buildSrc/src/main/kotlin/jvm-module.gradle.kts b/buildSrc/src/main/kotlin/jvm-module.gradle.kts index 76a70de6b..3dfdb47b1 100644 --- a/buildSrc/src/main/kotlin/jvm-module.gradle.kts +++ b/buildSrc/src/main/kotlin/jvm-module.gradle.kts @@ -1,5 +1,5 @@ /* - * 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. @@ -24,33 +24,24 @@ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -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.Spine -import io.spine.dependency.test.JUnit +import io.spine.dependency.local.Reflect 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 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.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") @@ -67,23 +58,23 @@ JavadocConfig.applyTo(project) CheckStyleConfig.applyTo(project) project.run { - configureJava(javaVersion) - configureKotlin(javaVersion) + configureJava() + configureKotlin() addDependencies() forceConfigurations() val generatedDir = "$projectDir/generated" setTaskDependencies(generatedDir) - setupTests() configureGitHubPages() } typealias Module = Project -fun Module.configureJava(javaVersion: JavaLanguageVersion) { +fun Module.configureJava() { java { - toolchain.languageVersion.set(javaVersion) + sourceCompatibility = BuildSettings.javaVersionCompat + targetCompatibility = BuildSettings.javaVersionCompat } tasks { @@ -94,27 +85,29 @@ 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() } } - 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 + } } } } @@ -134,21 +127,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(Spine.testlib) - testImplementation(Kotest.frameworkEngine) - testImplementation(Kotest.datatest) - testImplementation(Kotest.runnerJUnit5Jvm) - testImplementation(JUnit.runner) } fun Module.forceConfigurations() { @@ -158,28 +138,14 @@ fun Module.forceConfigurations() { all { resolutionStrategy { force( - JUnit.bom, - JUnit.runner, Dokka.BasePlugin.lib, - Spine.reflect + Reflect.lib, ) } } } } -fun Module.setupTests() { - tasks { - registerTestTasks() - test.configure { - useJUnitPlatform { - includeEngines("junit-jupiter") - } - configureLogging() - } - } -} - fun Module.setTaskDependencies(generatedDir: String) { tasks { val cleanGenerated by registering(Delete::class) { @@ -194,7 +160,9 @@ fun Module.setTaskDependencies(generatedDir: String) { publish?.dependsOn("${project.path}:updateGitHubPages") } } - configureTaskDependencies() + afterEvaluate { + configureTaskDependencies() + } } fun Module.configureGitHubPages() { diff --git a/buildSrc/src/main/kotlin/kmp-module.gradle.kts b/buildSrc/src/main/kotlin/kmp-module.gradle.kts index 025e4cb4d..70fbb6d7b 100644 --- a/buildSrc/src/main/kotlin/kmp-module.gradle.kts +++ b/buildSrc/src/main/kotlin/kmp-module.gradle.kts @@ -24,6 +24,7 @@ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +import io.spine.dependency.local.Reflect import io.spine.dependency.test.JUnit import io.spine.dependency.test.Jacoco import io.spine.dependency.test.Kotest @@ -83,7 +84,7 @@ fun Project.forceConfigurations() { all { resolutionStrategy { force( - Spine.reflect + Reflect.lib ) } } @@ -133,6 +134,12 @@ kotlin { } } +java { + sourceCompatibility = BuildSettings.javaVersionCompat + targetCompatibility = BuildSettings.javaVersionCompat +} + + /** * Performs the standard task's configuration. * @@ -148,9 +155,6 @@ tasks { withType().configureEach { configureJavac() } - withType().configureEach { - setFreeCompilerArgs() - } registerTestTasks() @@ -175,8 +179,8 @@ detekt { kover { useJacoco(version = Jacoco.version) - koverReport { - defaults { + reports { + total { xml { onCheck = true } 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 000000000..715852c7d --- /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/pmd-settings.gradle.kts b/buildSrc/src/main/kotlin/pmd-settings.gradle.kts index a3b089032..0373ee0f6 100644 --- a/buildSrc/src/main/kotlin/pmd-settings.gradle.kts +++ b/buildSrc/src/main/kotlin/pmd-settings.gradle.kts @@ -1,5 +1,5 @@ /* - * 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. diff --git a/buildSrc/src/main/kotlin/uber-jar-module.gradle.kts b/buildSrc/src/main/kotlin/uber-jar-module.gradle.kts new file mode 100644 index 000000000..29dba3c66 --- /dev/null +++ b/buildSrc/src/main/kotlin/uber-jar-module.gradle.kts @@ -0,0 +1,202 @@ +/* + * 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("UnstableApiUsage") // `configurations` block. + +import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar +import io.spine.gradle.publish.IncrementGuard +import io.spine.gradle.publish.SpinePublishing +import io.spine.gradle.publish.spinePublishing +import io.spine.gradle.report.license.LicenseReporter + +plugins { + `java-library` + `maven-publish` + id("com.gradleup.shadow") + id("write-manifest") + `project-report` + idea +} +apply() +LicenseReporter.generateReportIn(project) + +spinePublishing { + artifactPrefix = "" + destinations = rootProject.the().destinations + customPublishing = true +} + +/** The ID of the far JAR artifact. */ +private val projectArtifact = project.name.replace(":", "") + +publishing { + val groupName = project.group.toString() + val versionName = project.version.toString() + + publications { + create("fatJar", MavenPublication::class) { + groupId = groupName + artifactId = projectArtifact + version = versionName + artifact(tasks.shadowJar) + } + } +} + +/** + * Declare dependency explicitly to address the Gradle error. + */ +@Suppress("unused") +val publishFatJarPublicationToMavenLocal: Task by tasks.getting { + dependsOn(tasks.shadowJar) +} + +// Disable the `jar` task to free up the name of the resulting archive. +tasks.jar { + enabled = false +} + +tasks.publish { + dependsOn(tasks.shadowJar) +} + +tasks.shadowJar { + excludeFiles() + setZip64(true) /* The archive has way too many items. So using the Zip64 mode. */ + archiveClassifier.set("") /** To prevent Gradle setting something like `osx-x86_64`. */ +} + +/** + * Exclude unwanted directories. + */ +@Suppress("LongMethod") +private fun ShadowJar.excludeFiles() { + exclude( + /* + Exclude IntelliJ Platform images and other resources associated with IntelliJ UI. + We do not call the UI, so they won't be used. + */ + "actions/**", + "chooser/**", + "codeStyle/**", + "codeStylePreview/**", + "codeWithMe/**", + "darcula/**", + "debugger/**", + "diff/**", + "duplicates/**", + "expui/**", + "extensions/**", + "fileTemplates/**", + "fileTypes/**", + "general/**", + "graph/**", + "gutter/**", + "hierarchy/**", + "icons/**", + "ide/**", + "idea/**", + "inlayProviders/**", + "inspectionDescriptions/**", + "inspectionReport/**", + "intentionDescriptions/**", + "javadoc/**", + "javaee/**", + "json/**", + "liveTemplates/**", + "mac/**", + "modules/**", + "nodes/**", + "objectBrowser/**", + "plugins/**", + "postfixTemplates/**", + "preferences/**", + "process/**", + "providers/**", + "runConfigurations/**", + "scope/**", + "search/**", + "toolbar/**", + "toolbarDecorator/**", + "toolwindows/**", + "vcs/**", + "webreferences/**", + "welcome/**", + "windows/**", + "xml/**", + + /* + Exclude `https://github.com/JetBrains/pty4j`. + We don't need the terminal. + */ + "resources/com/pti4j/**", + + /* Exclude the IntelliJ fork of + `http://www.sparetimelabs.com/purejavacomm/purejavacomm.php`. + It is the part of the IDEA's terminal implementation. + */ + "purejavacomm/**", + + /* Exclude IDEA project templates. */ + "resources/projectTemplates/**", + + /* + Exclude dynamic libraries. Should the tool users need them, + they would add them explicitly. + */ + "bin/**", + + /* + Exclude Google Protobuf definitions to avoid duplicates. + */ + "google/**", + "src/google/**", + + /** + * Exclude Spine Protobuf definitions to avoid duplications. + */ + "spine/**", + + /** + * Exclude Kotlin runtime because it will be provided. + */ + "kotlin/**", + "kotlinx/**", + + /** + * Exclude native libraries related to debugging. + */ + "win32-x86/**", + "win32-x86-64/**", + + /** + * Exclude the Windows process management (WinP) libraries. + * See: `https://github.com/jenkinsci/winp`. + */ + "winp.dll", + "winp.x64.dll", + ) +} diff --git a/buildSrc/src/main/kotlin/write-manifest.gradle.kts b/buildSrc/src/main/kotlin/write-manifest.gradle.kts index 7bfcdb6db..b63d3272d 100644 --- a/buildSrc/src/main/kotlin/write-manifest.gradle.kts +++ b/buildSrc/src/main/kotlin/write-manifest.gradle.kts @@ -1,5 +1,5 @@ /* - * 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. @@ -103,7 +103,7 @@ val manifestAttributes = mapOf( * when running tests. We cannot depend on the `Jar` from `resources` because it would * form a circular dependency. */ -val exposeManifestForTests by tasks.creating { +val exposeManifestForTests by tasks.registering { val outputFile = layout.buildDirectory.file("resources/main/META-INF/MANIFEST.MF") outputs.file(outputFile).withPropertyName("manifestFile") diff --git a/config b/config index 44789e204..fab231bb9 160000 --- a/config +++ b/config @@ -1 +1 @@ -Subproject commit 44789e2047551235c130f784442684bb02c5663d +Subproject commit fab231bb932cf3ea2d51b89373f06dcb1e06cbc5 diff --git a/dependencies.md b/dependencies.md index 95a876f10..6a53f193a 100644 --- a/dependencies.md +++ b/dependencies.md @@ -810,7 +810,7 @@ The dependencies distributed under several licenses, are used according their commercial-use-friendly license. -This report was generated on **Fri Nov 01 15:40:47 WET 2024** 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 **Tue Jun 24 17:30:15 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). @@ -1687,7 +1687,7 @@ This report was generated on **Fri Nov 01 15:40:47 WET 2024** using [Gradle-Lice The dependencies distributed under several licenses, are used according their commercial-use-friendly license. -This report was generated on **Fri Nov 01 15:40:48 WET 2024** 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 **Tue Jun 24 17:30:44 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). @@ -2556,7 +2556,7 @@ This report was generated on **Fri Nov 01 15:40:48 WET 2024** using [Gradle-Lice The dependencies distributed under several licenses, are used according their commercial-use-friendly license. -This report was generated on **Fri Nov 01 15:40:48 WET 2024** 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 **Tue Jun 24 17:30:45 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). @@ -3433,7 +3433,7 @@ This report was generated on **Fri Nov 01 15:40:48 WET 2024** using [Gradle-Lice The dependencies distributed under several licenses, are used according their commercial-use-friendly license. -This report was generated on **Fri Nov 01 15:40:48 WET 2024** 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 **Tue Jun 24 17:30:46 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). @@ -4306,7 +4306,7 @@ This report was generated on **Fri Nov 01 15:40:48 WET 2024** using [Gradle-Lice The dependencies distributed under several licenses, are used according their commercial-use-friendly license. -This report was generated on **Fri Nov 01 15:40:49 WET 2024** 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 **Tue Jun 24 17:30:46 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). @@ -5175,7 +5175,7 @@ This report was generated on **Fri Nov 01 15:40:49 WET 2024** using [Gradle-Lice The dependencies distributed under several licenses, are used according their commercial-use-friendly license. -This report was generated on **Fri Nov 01 15:40:49 WET 2024** 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 **Tue Jun 24 17:30:46 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). @@ -6044,7 +6044,7 @@ This report was generated on **Fri Nov 01 15:40:49 WET 2024** using [Gradle-Lice The dependencies distributed under several licenses, are used according their commercial-use-friendly license. -This report was generated on **Fri Nov 01 15:40:49 WET 2024** 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 **Tue Jun 24 17:30:46 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). @@ -6921,7 +6921,7 @@ This report was generated on **Fri Nov 01 15:40:49 WET 2024** using [Gradle-Lice The dependencies distributed under several licenses, are used according their commercial-use-friendly license. -This report was generated on **Fri Nov 01 15:40:50 WET 2024** 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 **Tue Jun 24 17:30:47 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). @@ -7802,7 +7802,7 @@ This report was generated on **Fri Nov 01 15:40:50 WET 2024** using [Gradle-Lice The dependencies distributed under several licenses, are used according their commercial-use-friendly license. -This report was generated on **Fri Nov 01 15:40:50 WET 2024** 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 **Tue Jun 24 17:30:47 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). @@ -8683,7 +8683,7 @@ This report was generated on **Fri Nov 01 15:40:50 WET 2024** using [Gradle-Lice The dependencies distributed under several licenses, are used according their commercial-use-friendly license. -This report was generated on **Fri Nov 01 15:40:50 WET 2024** 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 **Tue Jun 24 17:30:47 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). @@ -9470,7 +9470,7 @@ This report was generated on **Fri Nov 01 15:40:50 WET 2024** using [Gradle-Lice The dependencies distributed under several licenses, are used according their commercial-use-friendly license. -This report was generated on **Fri Nov 01 15:40:51 WET 2024** 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 **Tue Jun 24 17:30:47 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). @@ -10257,7 +10257,7 @@ This report was generated on **Fri Nov 01 15:40:51 WET 2024** using [Gradle-Lice The dependencies distributed under several licenses, are used according their commercial-use-friendly license. -This report was generated on **Fri Nov 01 15:40:51 WET 2024** 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 **Tue Jun 24 17:30:48 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). @@ -11126,7 +11126,7 @@ This report was generated on **Fri Nov 01 15:40:51 WET 2024** using [Gradle-Lice The dependencies distributed under several licenses, are used according their commercial-use-friendly license. -This report was generated on **Fri Nov 01 15:40:51 WET 2024** 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 **Tue Jun 24 17:30:48 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). @@ -11987,7 +11987,7 @@ This report was generated on **Fri Nov 01 15:40:51 WET 2024** using [Gradle-Lice The dependencies distributed under several licenses, are used according their commercial-use-friendly license. -This report was generated on **Fri Nov 01 15:40:51 WET 2024** 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 **Tue Jun 24 17:30:48 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). @@ -13107,7 +13107,7 @@ This report was generated on **Fri Nov 01 15:40:51 WET 2024** using [Gradle-Lice The dependencies distributed under several licenses, are used according their commercial-use-friendly license. -This report was generated on **Fri Nov 01 15:40:52 WET 2024** 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 **Tue Jun 24 17:30:48 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). @@ -14043,7 +14043,7 @@ This report was generated on **Fri Nov 01 15:40:52 WET 2024** using [Gradle-Lice The dependencies distributed under several licenses, are used according their commercial-use-friendly license. -This report was generated on **Fri Nov 01 15:40:52 WET 2024** 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 **Tue Jun 24 17:30:49 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). @@ -14912,4 +14912,4 @@ This report was generated on **Fri Nov 01 15:40:52 WET 2024** using [Gradle-Lice The dependencies distributed under several licenses, are used according their commercial-use-friendly license. -This report was generated on **Fri Nov 01 15:40:52 WET 2024** 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 **Tue Jun 24 17:30:49 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.properties b/gradle.properties index 9016b9304..96c57c87e 100644 --- a/gradle.properties +++ b/gradle.properties @@ -24,6 +24,16 @@ # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # +# Allow Gradle to auto-detect installed JDKs. +org.gradle.java.installations.auto-detect=true + +# Optional: Allow Gradle to download JDKs if needed. +org.gradle.java.installations.auto-download=true + +# Use parallel builds for better performance. +org.gradle.parallel=true +#org.gradle.caching=true + org.gradle.jvmargs=-Xmx4096m -XX:MaxMetaspaceSize=1024m -XX:+UseParallelGC # suppress inspection "UnusedProperty" @@ -33,3 +43,8 @@ org.gradle.jvmargs=-Xmx4096m -XX:MaxMetaspaceSize=1024m -XX:+UseParallelGC # See: https://github.com/JetBrains/kotlin/blob/9fd05632f0d7f074b6544527e73eb0fbb2fb1ef2/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/testing/internal/KotlinTestReport.kt#L20 # See: https://youtrack.jetbrains.com/issue/KT-32608 kotlin.tests.individualTaskReports=true + +# 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 e6441136f3d4ba8a0da8d277868979cfbc8ad796..1b33c55baabb587c669f562ae36f953de2481846 100644 GIT binary patch delta 35073 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 delta 34912 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

Gn4F+B~IivciU9^t0j-Mgao3 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 dDuazZG^u*-) zCV{{p$D*4m=Z;!QJ0C3EBfaUv#@3CmRgS-#a4+Uk9LtR(mzdSt-?*B-Q{Jgs!F;+_ zT&Jc~{N951OskjVtnWOLnfUacmSEkQ#fQojqa=HN?aN#ubFA){K&TrfoSnBphJ<43S zS5?OUrqPYpEqf;(zc;IIty0d`-n-Ke%PlArJt^DN>ZYW)ZS5z$Rnx=cxbM1#zPRNS1N0u>c z*gpBeTvyKAjdr#Uz%$J3C+p2~l9`-P6`=_1Y83#nAp`Kd5jfb*H#u;=%w#=&g~|Q% z1!N9S7n+#|tj#t98*^$X3S9)i3I*n?N+YghXJ9Z!QN%wvV7|W$;;Lx|1{)Ol%c4L- zlz|txtAK4ozLL`xMPZR7Sm6grRj@+Db&BXF9#sG|gMywm=IO1O01imHv3 zFjX9ri>su;HX}wK85k5$R0A&?fdtA5_Q_vX$jc(elo%M~QB>A-K~#2igOjH$d^80Z zC8#NjzZarXrcVZJJEF73z+ix4=7c`5N>TJt7>~rfl$^E}UAMlP2$P)vS26{cE?ONf_&Vd@-E2?PMU+S~pB diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index df97d72b8..ff23a68d7 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.2-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/gradlew b/gradlew index 1aa94a426..23d15a936 100755 --- a/gradlew +++ b/gradlew @@ -15,6 +15,8 @@ # See the License for the specific language governing permissions and # limitations under the License. # +# SPDX-License-Identifier: Apache-2.0 +# ############################################################################## # @@ -55,7 +57,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/. @@ -84,7 +86,7 @@ done # shellcheck disable=SC2034 APP_BASE_NAME=${0##*/} # Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) -APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit +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 @@ -112,7 +114,7 @@ case "$( uname )" in #( NONSTOP* ) nonstop=true ;; esac -CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar +CLASSPATH="\\\"\\\"" # Determine the Java command to use to start the JVM. @@ -203,7 +205,7 @@ fi DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' # Collect all arguments for the java command: -# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# * 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. @@ -211,7 +213,7 @@ DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' set -- \ "-Dorg.gradle.appname=$APP_BASE_NAME" \ -classpath "$CLASSPATH" \ - org.gradle.wrapper.GradleWrapperMain \ + -jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \ "$@" # Stop when "xargs" is not available. diff --git a/gradlew.bat b/gradlew.bat index 25da30dbd..db3a6ac20 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 ########################################################################## @@ -68,11 +70,11 @@ goto fail :execute @rem Setup the command line -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar +set CLASSPATH= @rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* :end @rem End local scope for the variables with windows NT shell diff --git a/logging/build.gradle.kts b/logging/build.gradle.kts index 784c0c42b..7fd68adc1 100644 --- a/logging/build.gradle.kts +++ b/logging/build.gradle.kts @@ -24,6 +24,8 @@ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +@file:Suppress("unused") // source set accessed via `by getting`. + import io.spine.dependency.local.Spine import io.spine.gradle.publish.IncrementGuard import io.spine.gradle.publish.SpinePublishing @@ -33,10 +35,7 @@ plugins { `kmp-module` `kmp-publish` } - -apply { - plugin() -} +apply() // This module configures `spinePublishing` on its own to change a prefix // specified by the root project. diff --git a/platforms/jvm-default-platform/build.gradle.kts b/platforms/jvm-default-platform/build.gradle.kts index a3f4e852f..2b1b12a68 100644 --- a/platforms/jvm-default-platform/build.gradle.kts +++ b/platforms/jvm-default-platform/build.gradle.kts @@ -59,7 +59,7 @@ java { */ afterEvaluate { // `kaptKotlin` task is created after the configuration phase, - // so we have to use `afterEvaluate` block. + // so we have to use the `afterEvaluate` block. val kaptKotlin by tasks.existing val dokkaHtml by tasks.existing { dependsOn(kaptKotlin) diff --git a/pom.xml b/pom.xml index a0afde217..10b1e920b 100644 --- a/pom.xml +++ b/pom.xml @@ -1,30 +1,4 @@ - - 4.0.0 + 4.0.0 io.spine spine-logging -2.0.0-SNAPSHOT.242 +2.0.0-SNAPSHOT.250 2015 From 98d415350343786d5b48ff79da7bb8a15d953607 Mon Sep 17 00:00:00 2001 From: Alexander Yevsyukov Date: Wed, 25 Jun 2025 12:46:24 +0100 Subject: [PATCH 09/24] Restore mutual copyright statement --- dependencies.md | 34 +++++++++---------- .../spine/logging/flogger/AbstractLogger.java | 4 +-- .../logging/flogger/FloggerMetadataKey.java | 4 +-- .../io/spine/logging/flogger/LazyArgs.java | 4 +-- .../io/spine/logging/flogger/LogSiteKey.java | 4 +-- .../io/spine/logging/flogger/LogSiteMap.java | 4 +-- .../spine/logging/flogger/LoggingScope.java | 4 +-- .../io/spine/logging/flogger/StackSize.java | 4 +-- .../flogger/backend/BackendFactory.java | 4 +-- .../flogger/backend/BaseMessageFormatter.java | 4 +-- .../spine/logging/flogger/backend/Clock.java | 4 +-- .../logging/flogger/backend/FormatChar.java | 4 +-- .../logging/flogger/backend/FormatType.java | 4 +-- .../logging/flogger/backend/LogData.java | 4 +-- .../flogger/backend/LogMessageFormatter.java | 4 +-- .../flogger/backend/LoggerBackend.java | 4 +-- .../logging/flogger/backend/MessageUtils.java | 4 +-- .../flogger/backend/MetadataHandler.java | 4 +-- .../backend/MetadataKeyValueHandlers.java | 4 +-- .../flogger/backend/MetadataProcessor.java | 4 +-- .../flogger/backend/TemplateContext.java | 4 +-- .../logging/flogger/backend/package-info.java | 4 +-- .../logging/flogger/context/LogLevelMap.java | 4 +-- .../context/NoOpContextDataProvider.java | 4 +-- .../context/ScopedLoggingContexts.java | 4 +-- .../logging/flogger/context/SegmentTrie.java | 4 +-- .../logging/flogger/context/package-info.java | 4 +-- .../spine/logging/flogger/package-info.java | 4 +-- .../parameter/BraceStyleParameter.java | 4 +-- .../flogger/parameter/DateTimeFormat.java | 4 +-- .../flogger/parameter/DateTimeParameter.java | 4 +-- .../logging/flogger/parameter/Parameter.java | 4 +-- .../flogger/parameter/ParameterVisitor.java | 4 +-- .../flogger/parameter/SimpleParameter.java | 4 +-- .../flogger/parameter/package-info.java | 4 +-- .../parser/BraceStyleMessageParser.java | 4 +-- .../DefaultBraceStyleMessageParser.java | 4 +-- .../parser/DefaultPrintfMessageParser.java | 4 +-- .../flogger/parser/MessageBuilder.java | 4 +-- .../logging/flogger/parser/MessageParser.java | 4 +-- .../flogger/parser/ParseException.java | 4 +-- .../flogger/parser/PrintfMessageParser.java | 4 +-- .../logging/flogger/parser/package-info.java | 4 +-- .../io/spine/logging/flogger/util/Checks.java | 4 +-- .../logging/flogger/util/RecursionDepth.java | 4 +-- .../logging/flogger/util/package-info.java | 4 +-- .../logging/flogger/FloggerMetadataKeys.kt | 4 +-- .../logging/flogger/AbstractLoggerSpec.kt | 4 +-- .../flogger/CountingRateLimiterSpec.kt | 4 +-- .../flogger/DurationRateLimiterSpec.kt | 4 +-- .../logging/flogger/FloggerLogSitesSpec.kt | 4 +-- .../logging/flogger/FloggerMetadataKeySpec.kt | 4 +-- .../logging/flogger/FluentLogger2Spec.kt | 2 +- .../spine/logging/flogger/LogContextSpec.kt | 4 +-- .../flogger/LogPerBucketingStrategySpec.kt | 4 +-- .../spine/logging/flogger/LogSiteMapSpec.kt | 4 +-- .../logging/flogger/LogSiteStackTraceSpec.kt | 4 +-- .../spine/logging/flogger/LoggingScopeSpec.kt | 4 +-- .../logging/flogger/RateLimitStatusSpec.kt | 4 +-- .../flogger/SamplingRateLimiterSpec.kt | 4 +-- .../flogger/SpecializedLogSiteKeySpec.kt | 4 +-- .../logging/flogger/StackBasedLogSiteSpec.kt | 4 +-- .../backend/BaseMessageFormatterSpec.kt | 4 +-- .../logging/flogger/backend/FormatCharSpec.kt | 4 +-- .../flogger/backend/FormatOptionsSpec.kt | 4 +-- .../logging/flogger/backend/FormatTypeSpec.kt | 4 +-- .../flogger/backend/KeyValueFormatterSpec.kt | 4 +-- .../backend/LightweightProcessorSpec.kt | 4 +-- .../flogger/backend/MessageUtilsSpec.kt | 4 +-- .../flogger/backend/MetadataHandlerSpec.kt | 4 +-- .../backend/MetadataKeyValueHandlersSpec.kt | 4 +-- .../flogger/backend/MetadataProcessorSpec.kt | 4 +-- .../backend/SimpleMessageFormatterSpec.kt | 4 +-- .../flogger/backend/SimpleProcessorSpec.kt | 4 +-- .../flogger/backend/given/FakeLogData.kt | 4 +-- .../flogger/backend/given/FakeMetadata.kt | 4 +-- .../backend/given/MemoizingLoggerBackend.kt | 4 +-- .../backend/given/MetadataAssertions.kt | 4 +-- .../flogger/context/ContextMetadataSpec.kt | 4 +-- .../flogger/context/LogLevelMapSpec.kt | 4 +-- .../context/ScopedLoggingContextSpec.kt | 4 +-- .../flogger/context/SegmentTrieSpec.kt | 4 +-- .../spine/logging/flogger/context/TagsSpec.kt | 4 +-- .../logging/flogger/given/BackendTestEnv.kt | 4 +-- .../flogger/given/ConfigurableLogger.kt | 4 +-- .../logging/flogger/given/FakeLogSite.kt | 4 +-- .../flogger/given/FormattingBackend.kt | 4 +-- .../flogger/given/LogDataAssertions.kt | 4 +-- .../flogger/given/MemoizingKvHandler.kt | 4 +-- .../flogger/parameter/ParameterSpec.kt | 4 +-- .../flogger/parameter/SimpleParameterSpec.kt | 4 +-- .../parser/BraceStyleMessageParserSpec.kt | 4 +-- .../flogger/parser/PrintfMessageParserSpec.kt | 4 +-- .../flogger/parser/given/ParserTestEnv.kt | 4 +-- 94 files changed, 202 insertions(+), 202 deletions(-) diff --git a/dependencies.md b/dependencies.md index 5fd010dc2..c19e0e8f3 100644 --- a/dependencies.md +++ b/dependencies.md @@ -724,7 +724,7 @@ The dependencies distributed under several licenses, are used according their commercial-use-friendly license. -This report was generated on **Wed Jun 25 12:18:17 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). +This report was generated on **Wed Jun 25 12:42:56 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). @@ -1553,7 +1553,7 @@ This report was generated on **Wed Jun 25 12:18:17 WEST 2025** using [Gradle-Lic The dependencies distributed under several licenses, are used according their commercial-use-friendly license. -This report was generated on **Wed Jun 25 12:18:17 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). +This report was generated on **Wed Jun 25 12:42:56 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). @@ -2366,7 +2366,7 @@ This report was generated on **Wed Jun 25 12:18:17 WEST 2025** using [Gradle-Lic The dependencies distributed under several licenses, are used according their commercial-use-friendly license. -This report was generated on **Wed Jun 25 12:18:17 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). +This report was generated on **Wed Jun 25 12:42:57 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). @@ -3187,7 +3187,7 @@ This report was generated on **Wed Jun 25 12:18:17 WEST 2025** using [Gradle-Lic The dependencies distributed under several licenses, are used according their commercial-use-friendly license. -This report was generated on **Wed Jun 25 12:18:18 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). +This report was generated on **Wed Jun 25 12:42:57 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). @@ -4035,7 +4035,7 @@ This report was generated on **Wed Jun 25 12:18:18 WEST 2025** using [Gradle-Lic The dependencies distributed under several licenses, are used according their commercial-use-friendly license. -This report was generated on **Wed Jun 25 12:18:18 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). +This report was generated on **Wed Jun 25 12:42:57 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). @@ -4875,7 +4875,7 @@ This report was generated on **Wed Jun 25 12:18:18 WEST 2025** using [Gradle-Lic The dependencies distributed under several licenses, are used according their commercial-use-friendly license. -This report was generated on **Wed Jun 25 12:18:18 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). +This report was generated on **Wed Jun 25 12:42:57 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). @@ -5715,7 +5715,7 @@ This report was generated on **Wed Jun 25 12:18:18 WEST 2025** using [Gradle-Lic The dependencies distributed under several licenses, are used according their commercial-use-friendly license. -This report was generated on **Wed Jun 25 12:18:18 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). +This report was generated on **Wed Jun 25 12:42:57 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). @@ -6563,7 +6563,7 @@ This report was generated on **Wed Jun 25 12:18:18 WEST 2025** using [Gradle-Lic The dependencies distributed under several licenses, are used according their commercial-use-friendly license. -This report was generated on **Wed Jun 25 12:18:19 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). +This report was generated on **Wed Jun 25 12:42:57 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). @@ -7415,7 +7415,7 @@ This report was generated on **Wed Jun 25 12:18:19 WEST 2025** using [Gradle-Lic The dependencies distributed under several licenses, are used according their commercial-use-friendly license. -This report was generated on **Wed Jun 25 12:18:19 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). +This report was generated on **Wed Jun 25 12:42:58 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). @@ -8244,7 +8244,7 @@ This report was generated on **Wed Jun 25 12:18:19 WEST 2025** using [Gradle-Lic The dependencies distributed under several licenses, are used according their commercial-use-friendly license. -This report was generated on **Wed Jun 25 12:18:19 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). +This report was generated on **Wed Jun 25 12:42:58 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). @@ -8981,7 +8981,7 @@ This report was generated on **Wed Jun 25 12:18:19 WEST 2025** using [Gradle-Lic The dependencies distributed under several licenses, are used according their commercial-use-friendly license. -This report was generated on **Wed Jun 25 12:18:19 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). +This report was generated on **Wed Jun 25 12:42:59 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). @@ -9706,7 +9706,7 @@ This report was generated on **Wed Jun 25 12:18:19 WEST 2025** using [Gradle-Lic The dependencies distributed under several licenses, are used according their commercial-use-friendly license. -This report was generated on **Wed Jun 25 12:18:20 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). +This report was generated on **Wed Jun 25 12:42:59 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). @@ -10519,7 +10519,7 @@ This report was generated on **Wed Jun 25 12:18:20 WEST 2025** using [Gradle-Lic The dependencies distributed under several licenses, are used according their commercial-use-friendly license. -This report was generated on **Wed Jun 25 12:18:20 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). +This report was generated on **Wed Jun 25 12:42:59 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). @@ -11308,7 +11308,7 @@ This report was generated on **Wed Jun 25 12:18:20 WEST 2025** using [Gradle-Lic The dependencies distributed under several licenses, are used according their commercial-use-friendly license. -This report was generated on **Wed Jun 25 12:18:20 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). +This report was generated on **Wed Jun 25 12:42:59 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). @@ -12296,7 +12296,7 @@ This report was generated on **Wed Jun 25 12:18:20 WEST 2025** using [Gradle-Lic The dependencies distributed under several licenses, are used according their commercial-use-friendly license. -This report was generated on **Wed Jun 25 12:18:20 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). +This report was generated on **Wed Jun 25 12:42:59 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). @@ -13169,7 +13169,7 @@ This report was generated on **Wed Jun 25 12:18:20 WEST 2025** using [Gradle-Lic The dependencies distributed under several licenses, are used according their commercial-use-friendly license. -This report was generated on **Wed Jun 25 12:18:20 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). +This report was generated on **Wed Jun 25 12:43:00 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). @@ -13986,4 +13986,4 @@ This report was generated on **Wed Jun 25 12:18:20 WEST 2025** using [Gradle-Lic The dependencies distributed under several licenses, are used according their commercial-use-friendly license. -This report was generated on **Wed Jun 25 12:18:21 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 +This report was generated on **Wed Jun 25 12:43:00 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/flogger/middleware/src/main/java/io/spine/logging/flogger/AbstractLogger.java b/flogger/middleware/src/main/java/io/spine/logging/flogger/AbstractLogger.java index e9bde42d8..4d8f0babd 100644 --- a/flogger/middleware/src/main/java/io/spine/logging/flogger/AbstractLogger.java +++ b/flogger/middleware/src/main/java/io/spine/logging/flogger/AbstractLogger.java @@ -1,11 +1,11 @@ /* - * Copyright 2012, The Flogger Authors; 2023, 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 diff --git a/flogger/middleware/src/main/java/io/spine/logging/flogger/FloggerMetadataKey.java b/flogger/middleware/src/main/java/io/spine/logging/flogger/FloggerMetadataKey.java index 45077f49e..b92a5c775 100644 --- a/flogger/middleware/src/main/java/io/spine/logging/flogger/FloggerMetadataKey.java +++ b/flogger/middleware/src/main/java/io/spine/logging/flogger/FloggerMetadataKey.java @@ -1,11 +1,11 @@ /* - * Copyright 2018, The Flogger Authors; 2023, 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 diff --git a/flogger/middleware/src/main/java/io/spine/logging/flogger/LazyArgs.java b/flogger/middleware/src/main/java/io/spine/logging/flogger/LazyArgs.java index 387c6a05f..3aa29e3cd 100644 --- a/flogger/middleware/src/main/java/io/spine/logging/flogger/LazyArgs.java +++ b/flogger/middleware/src/main/java/io/spine/logging/flogger/LazyArgs.java @@ -1,11 +1,11 @@ /* - * Copyright 2017, The Flogger Authors; 2023, 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 diff --git a/flogger/middleware/src/main/java/io/spine/logging/flogger/LogSiteKey.java b/flogger/middleware/src/main/java/io/spine/logging/flogger/LogSiteKey.java index 368efdc34..cbe04ec06 100644 --- a/flogger/middleware/src/main/java/io/spine/logging/flogger/LogSiteKey.java +++ b/flogger/middleware/src/main/java/io/spine/logging/flogger/LogSiteKey.java @@ -1,11 +1,11 @@ /* - * Copyright 2016, The Flogger Authors; 2023, 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 diff --git a/flogger/middleware/src/main/java/io/spine/logging/flogger/LogSiteMap.java b/flogger/middleware/src/main/java/io/spine/logging/flogger/LogSiteMap.java index 1f9a04160..d9acb39e6 100644 --- a/flogger/middleware/src/main/java/io/spine/logging/flogger/LogSiteMap.java +++ b/flogger/middleware/src/main/java/io/spine/logging/flogger/LogSiteMap.java @@ -1,11 +1,11 @@ /* - * Copyright 2020, The Flogger Authors; 2023, 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 diff --git a/flogger/middleware/src/main/java/io/spine/logging/flogger/LoggingScope.java b/flogger/middleware/src/main/java/io/spine/logging/flogger/LoggingScope.java index 6bb3d04b4..84a46439c 100644 --- a/flogger/middleware/src/main/java/io/spine/logging/flogger/LoggingScope.java +++ b/flogger/middleware/src/main/java/io/spine/logging/flogger/LoggingScope.java @@ -1,11 +1,11 @@ /* - * Copyright 2020, The Flogger Authors; 2023, 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 diff --git a/flogger/middleware/src/main/java/io/spine/logging/flogger/StackSize.java b/flogger/middleware/src/main/java/io/spine/logging/flogger/StackSize.java index b701654fb..dc71c7b83 100644 --- a/flogger/middleware/src/main/java/io/spine/logging/flogger/StackSize.java +++ b/flogger/middleware/src/main/java/io/spine/logging/flogger/StackSize.java @@ -1,11 +1,11 @@ /* - * Copyright 2016, The Flogger Authors; 2023, 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 diff --git a/flogger/middleware/src/main/java/io/spine/logging/flogger/backend/BackendFactory.java b/flogger/middleware/src/main/java/io/spine/logging/flogger/backend/BackendFactory.java index b659c5b3b..261db447c 100644 --- a/flogger/middleware/src/main/java/io/spine/logging/flogger/backend/BackendFactory.java +++ b/flogger/middleware/src/main/java/io/spine/logging/flogger/backend/BackendFactory.java @@ -1,11 +1,11 @@ /* - * Copyright 2014, The Flogger Authors; 2023, 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 diff --git a/flogger/middleware/src/main/java/io/spine/logging/flogger/backend/BaseMessageFormatter.java b/flogger/middleware/src/main/java/io/spine/logging/flogger/backend/BaseMessageFormatter.java index 687172422..213c223c3 100644 --- a/flogger/middleware/src/main/java/io/spine/logging/flogger/backend/BaseMessageFormatter.java +++ b/flogger/middleware/src/main/java/io/spine/logging/flogger/backend/BaseMessageFormatter.java @@ -1,11 +1,11 @@ /* - * Copyright 2020, The Flogger Authors; 2023, 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 diff --git a/flogger/middleware/src/main/java/io/spine/logging/flogger/backend/Clock.java b/flogger/middleware/src/main/java/io/spine/logging/flogger/backend/Clock.java index ece0d53f2..bb2b72134 100644 --- a/flogger/middleware/src/main/java/io/spine/logging/flogger/backend/Clock.java +++ b/flogger/middleware/src/main/java/io/spine/logging/flogger/backend/Clock.java @@ -1,11 +1,11 @@ /* - * Copyright 2017, The Flogger Authors; 2023, 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 diff --git a/flogger/middleware/src/main/java/io/spine/logging/flogger/backend/FormatChar.java b/flogger/middleware/src/main/java/io/spine/logging/flogger/backend/FormatChar.java index ae653f648..7df74f6ff 100644 --- a/flogger/middleware/src/main/java/io/spine/logging/flogger/backend/FormatChar.java +++ b/flogger/middleware/src/main/java/io/spine/logging/flogger/backend/FormatChar.java @@ -1,11 +1,11 @@ /* - * Copyright 2012, The Flogger Authors; 2023, 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 diff --git a/flogger/middleware/src/main/java/io/spine/logging/flogger/backend/FormatType.java b/flogger/middleware/src/main/java/io/spine/logging/flogger/backend/FormatType.java index 74e25a068..f5b98bf1f 100644 --- a/flogger/middleware/src/main/java/io/spine/logging/flogger/backend/FormatType.java +++ b/flogger/middleware/src/main/java/io/spine/logging/flogger/backend/FormatType.java @@ -1,11 +1,11 @@ /* - * Copyright 2012, The Flogger Authors; 2023, 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 diff --git a/flogger/middleware/src/main/java/io/spine/logging/flogger/backend/LogData.java b/flogger/middleware/src/main/java/io/spine/logging/flogger/backend/LogData.java index 0d01ab900..7190fd393 100644 --- a/flogger/middleware/src/main/java/io/spine/logging/flogger/backend/LogData.java +++ b/flogger/middleware/src/main/java/io/spine/logging/flogger/backend/LogData.java @@ -1,11 +1,11 @@ /* - * Copyright 2012, The Flogger Authors; 2023, 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 diff --git a/flogger/middleware/src/main/java/io/spine/logging/flogger/backend/LogMessageFormatter.java b/flogger/middleware/src/main/java/io/spine/logging/flogger/backend/LogMessageFormatter.java index 8cd93daf8..45e587e47 100644 --- a/flogger/middleware/src/main/java/io/spine/logging/flogger/backend/LogMessageFormatter.java +++ b/flogger/middleware/src/main/java/io/spine/logging/flogger/backend/LogMessageFormatter.java @@ -1,11 +1,11 @@ /* - * Copyright 2020, The Flogger Authors; 2023, 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 diff --git a/flogger/middleware/src/main/java/io/spine/logging/flogger/backend/LoggerBackend.java b/flogger/middleware/src/main/java/io/spine/logging/flogger/backend/LoggerBackend.java index cf68d74c4..2647dc1e3 100644 --- a/flogger/middleware/src/main/java/io/spine/logging/flogger/backend/LoggerBackend.java +++ b/flogger/middleware/src/main/java/io/spine/logging/flogger/backend/LoggerBackend.java @@ -1,11 +1,11 @@ /* - * Copyright 2012, The Flogger Authors; 2023, 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 diff --git a/flogger/middleware/src/main/java/io/spine/logging/flogger/backend/MessageUtils.java b/flogger/middleware/src/main/java/io/spine/logging/flogger/backend/MessageUtils.java index 795757cca..3e8519004 100644 --- a/flogger/middleware/src/main/java/io/spine/logging/flogger/backend/MessageUtils.java +++ b/flogger/middleware/src/main/java/io/spine/logging/flogger/backend/MessageUtils.java @@ -1,11 +1,11 @@ /* - * Copyright 2020, The Flogger Authors; 2023, 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 diff --git a/flogger/middleware/src/main/java/io/spine/logging/flogger/backend/MetadataHandler.java b/flogger/middleware/src/main/java/io/spine/logging/flogger/backend/MetadataHandler.java index 1d4679ce2..74ce92b7c 100644 --- a/flogger/middleware/src/main/java/io/spine/logging/flogger/backend/MetadataHandler.java +++ b/flogger/middleware/src/main/java/io/spine/logging/flogger/backend/MetadataHandler.java @@ -1,11 +1,11 @@ /* - * Copyright 2020, The Flogger Authors; 2023, 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 diff --git a/flogger/middleware/src/main/java/io/spine/logging/flogger/backend/MetadataKeyValueHandlers.java b/flogger/middleware/src/main/java/io/spine/logging/flogger/backend/MetadataKeyValueHandlers.java index 585f9f420..f4d9b93d9 100644 --- a/flogger/middleware/src/main/java/io/spine/logging/flogger/backend/MetadataKeyValueHandlers.java +++ b/flogger/middleware/src/main/java/io/spine/logging/flogger/backend/MetadataKeyValueHandlers.java @@ -1,11 +1,11 @@ /* - * Copyright 2020, The Flogger Authors; 2023, 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 diff --git a/flogger/middleware/src/main/java/io/spine/logging/flogger/backend/MetadataProcessor.java b/flogger/middleware/src/main/java/io/spine/logging/flogger/backend/MetadataProcessor.java index 8d9a334e3..54abd3235 100644 --- a/flogger/middleware/src/main/java/io/spine/logging/flogger/backend/MetadataProcessor.java +++ b/flogger/middleware/src/main/java/io/spine/logging/flogger/backend/MetadataProcessor.java @@ -1,11 +1,11 @@ /* - * Copyright 2020, The Flogger Authors; 2023, 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 diff --git a/flogger/middleware/src/main/java/io/spine/logging/flogger/backend/TemplateContext.java b/flogger/middleware/src/main/java/io/spine/logging/flogger/backend/TemplateContext.java index cd1306d8f..07bd2a86c 100644 --- a/flogger/middleware/src/main/java/io/spine/logging/flogger/backend/TemplateContext.java +++ b/flogger/middleware/src/main/java/io/spine/logging/flogger/backend/TemplateContext.java @@ -1,11 +1,11 @@ /* - * Copyright 2014, The Flogger Authors; 2023, 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 diff --git a/flogger/middleware/src/main/java/io/spine/logging/flogger/backend/package-info.java b/flogger/middleware/src/main/java/io/spine/logging/flogger/backend/package-info.java index 586ad12cd..2fa84fc7f 100644 --- a/flogger/middleware/src/main/java/io/spine/logging/flogger/backend/package-info.java +++ b/flogger/middleware/src/main/java/io/spine/logging/flogger/backend/package-info.java @@ -1,11 +1,11 @@ /* - * Copyright 2023, The Flogger Authors; 2023, 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 diff --git a/flogger/middleware/src/main/java/io/spine/logging/flogger/context/LogLevelMap.java b/flogger/middleware/src/main/java/io/spine/logging/flogger/context/LogLevelMap.java index 2d386b489..9f9f5284e 100644 --- a/flogger/middleware/src/main/java/io/spine/logging/flogger/context/LogLevelMap.java +++ b/flogger/middleware/src/main/java/io/spine/logging/flogger/context/LogLevelMap.java @@ -1,11 +1,11 @@ /* - * Copyright 2019, The Flogger Authors; 2023, 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 diff --git a/flogger/middleware/src/main/java/io/spine/logging/flogger/context/NoOpContextDataProvider.java b/flogger/middleware/src/main/java/io/spine/logging/flogger/context/NoOpContextDataProvider.java index df10828b5..4e258ed43 100644 --- a/flogger/middleware/src/main/java/io/spine/logging/flogger/context/NoOpContextDataProvider.java +++ b/flogger/middleware/src/main/java/io/spine/logging/flogger/context/NoOpContextDataProvider.java @@ -1,11 +1,11 @@ /* - * Copyright 2020, The Flogger Authors; 2023, 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 diff --git a/flogger/middleware/src/main/java/io/spine/logging/flogger/context/ScopedLoggingContexts.java b/flogger/middleware/src/main/java/io/spine/logging/flogger/context/ScopedLoggingContexts.java index fbc866571..ce0c2c348 100644 --- a/flogger/middleware/src/main/java/io/spine/logging/flogger/context/ScopedLoggingContexts.java +++ b/flogger/middleware/src/main/java/io/spine/logging/flogger/context/ScopedLoggingContexts.java @@ -1,11 +1,11 @@ /* - * Copyright 2021, The Flogger Authors; 2023, 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 diff --git a/flogger/middleware/src/main/java/io/spine/logging/flogger/context/SegmentTrie.java b/flogger/middleware/src/main/java/io/spine/logging/flogger/context/SegmentTrie.java index 772809461..72169c55e 100644 --- a/flogger/middleware/src/main/java/io/spine/logging/flogger/context/SegmentTrie.java +++ b/flogger/middleware/src/main/java/io/spine/logging/flogger/context/SegmentTrie.java @@ -1,11 +1,11 @@ /* - * Copyright 2019, The Flogger Authors; 2023, 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 diff --git a/flogger/middleware/src/main/java/io/spine/logging/flogger/context/package-info.java b/flogger/middleware/src/main/java/io/spine/logging/flogger/context/package-info.java index 9971c0357..e0b40a5c7 100644 --- a/flogger/middleware/src/main/java/io/spine/logging/flogger/context/package-info.java +++ b/flogger/middleware/src/main/java/io/spine/logging/flogger/context/package-info.java @@ -1,11 +1,11 @@ /* - * Copyright 2023, The Flogger Authors; 2023, 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 diff --git a/flogger/middleware/src/main/java/io/spine/logging/flogger/package-info.java b/flogger/middleware/src/main/java/io/spine/logging/flogger/package-info.java index 9047e8f88..54ab368a1 100644 --- a/flogger/middleware/src/main/java/io/spine/logging/flogger/package-info.java +++ b/flogger/middleware/src/main/java/io/spine/logging/flogger/package-info.java @@ -1,11 +1,11 @@ /* - * Copyright 2015, The Flogger Authors; 2023, 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 diff --git a/flogger/middleware/src/main/java/io/spine/logging/flogger/parameter/BraceStyleParameter.java b/flogger/middleware/src/main/java/io/spine/logging/flogger/parameter/BraceStyleParameter.java index 69a4fb021..a3543b33b 100644 --- a/flogger/middleware/src/main/java/io/spine/logging/flogger/parameter/BraceStyleParameter.java +++ b/flogger/middleware/src/main/java/io/spine/logging/flogger/parameter/BraceStyleParameter.java @@ -1,11 +1,11 @@ /* - * Copyright 2012, The Flogger Authors; 2023, 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 diff --git a/flogger/middleware/src/main/java/io/spine/logging/flogger/parameter/DateTimeFormat.java b/flogger/middleware/src/main/java/io/spine/logging/flogger/parameter/DateTimeFormat.java index c023e3087..549a1560f 100644 --- a/flogger/middleware/src/main/java/io/spine/logging/flogger/parameter/DateTimeFormat.java +++ b/flogger/middleware/src/main/java/io/spine/logging/flogger/parameter/DateTimeFormat.java @@ -1,11 +1,11 @@ /* - * Copyright 2014, The Flogger Authors; 2023, 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 diff --git a/flogger/middleware/src/main/java/io/spine/logging/flogger/parameter/DateTimeParameter.java b/flogger/middleware/src/main/java/io/spine/logging/flogger/parameter/DateTimeParameter.java index 83d2b3848..29838ef3f 100644 --- a/flogger/middleware/src/main/java/io/spine/logging/flogger/parameter/DateTimeParameter.java +++ b/flogger/middleware/src/main/java/io/spine/logging/flogger/parameter/DateTimeParameter.java @@ -1,11 +1,11 @@ /* - * Copyright 2014, The Flogger Authors; 2023, 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 diff --git a/flogger/middleware/src/main/java/io/spine/logging/flogger/parameter/Parameter.java b/flogger/middleware/src/main/java/io/spine/logging/flogger/parameter/Parameter.java index e75eb7729..752d82c3e 100644 --- a/flogger/middleware/src/main/java/io/spine/logging/flogger/parameter/Parameter.java +++ b/flogger/middleware/src/main/java/io/spine/logging/flogger/parameter/Parameter.java @@ -1,11 +1,11 @@ /* - * Copyright 2012, The Flogger Authors; 2023, 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 diff --git a/flogger/middleware/src/main/java/io/spine/logging/flogger/parameter/ParameterVisitor.java b/flogger/middleware/src/main/java/io/spine/logging/flogger/parameter/ParameterVisitor.java index 754f55b15..1f41dc74e 100644 --- a/flogger/middleware/src/main/java/io/spine/logging/flogger/parameter/ParameterVisitor.java +++ b/flogger/middleware/src/main/java/io/spine/logging/flogger/parameter/ParameterVisitor.java @@ -1,11 +1,11 @@ /* - * Copyright 2017, The Flogger Authors; 2023, 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 diff --git a/flogger/middleware/src/main/java/io/spine/logging/flogger/parameter/SimpleParameter.java b/flogger/middleware/src/main/java/io/spine/logging/flogger/parameter/SimpleParameter.java index 4032dd55d..6fac1a391 100644 --- a/flogger/middleware/src/main/java/io/spine/logging/flogger/parameter/SimpleParameter.java +++ b/flogger/middleware/src/main/java/io/spine/logging/flogger/parameter/SimpleParameter.java @@ -1,11 +1,11 @@ /* - * Copyright 2012, The Flogger Authors; 2023, 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 diff --git a/flogger/middleware/src/main/java/io/spine/logging/flogger/parameter/package-info.java b/flogger/middleware/src/main/java/io/spine/logging/flogger/parameter/package-info.java index 409d928b1..2f117af41 100644 --- a/flogger/middleware/src/main/java/io/spine/logging/flogger/parameter/package-info.java +++ b/flogger/middleware/src/main/java/io/spine/logging/flogger/parameter/package-info.java @@ -1,11 +1,11 @@ /* - * Copyright 2015, The Flogger Authors; 2023, 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 diff --git a/flogger/middleware/src/main/java/io/spine/logging/flogger/parser/BraceStyleMessageParser.java b/flogger/middleware/src/main/java/io/spine/logging/flogger/parser/BraceStyleMessageParser.java index 15cc69412..68ca59fb7 100644 --- a/flogger/middleware/src/main/java/io/spine/logging/flogger/parser/BraceStyleMessageParser.java +++ b/flogger/middleware/src/main/java/io/spine/logging/flogger/parser/BraceStyleMessageParser.java @@ -1,11 +1,11 @@ /* - * Copyright 2015, The Flogger Authors; 2023, 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 diff --git a/flogger/middleware/src/main/java/io/spine/logging/flogger/parser/DefaultBraceStyleMessageParser.java b/flogger/middleware/src/main/java/io/spine/logging/flogger/parser/DefaultBraceStyleMessageParser.java index 48ee70c00..230c6fd4b 100644 --- a/flogger/middleware/src/main/java/io/spine/logging/flogger/parser/DefaultBraceStyleMessageParser.java +++ b/flogger/middleware/src/main/java/io/spine/logging/flogger/parser/DefaultBraceStyleMessageParser.java @@ -1,11 +1,11 @@ /* - * Copyright 2015, The Flogger Authors; 2023, 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 diff --git a/flogger/middleware/src/main/java/io/spine/logging/flogger/parser/DefaultPrintfMessageParser.java b/flogger/middleware/src/main/java/io/spine/logging/flogger/parser/DefaultPrintfMessageParser.java index b34b92a7a..577074327 100644 --- a/flogger/middleware/src/main/java/io/spine/logging/flogger/parser/DefaultPrintfMessageParser.java +++ b/flogger/middleware/src/main/java/io/spine/logging/flogger/parser/DefaultPrintfMessageParser.java @@ -1,11 +1,11 @@ /* - * Copyright 2015, The Flogger Authors; 2023, 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 diff --git a/flogger/middleware/src/main/java/io/spine/logging/flogger/parser/MessageBuilder.java b/flogger/middleware/src/main/java/io/spine/logging/flogger/parser/MessageBuilder.java index 30e39ae39..2e7b762b1 100644 --- a/flogger/middleware/src/main/java/io/spine/logging/flogger/parser/MessageBuilder.java +++ b/flogger/middleware/src/main/java/io/spine/logging/flogger/parser/MessageBuilder.java @@ -1,11 +1,11 @@ /* - * Copyright 2012, The Flogger Authors; 2023, 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 diff --git a/flogger/middleware/src/main/java/io/spine/logging/flogger/parser/MessageParser.java b/flogger/middleware/src/main/java/io/spine/logging/flogger/parser/MessageParser.java index 0aad68fa2..7e629dc43 100644 --- a/flogger/middleware/src/main/java/io/spine/logging/flogger/parser/MessageParser.java +++ b/flogger/middleware/src/main/java/io/spine/logging/flogger/parser/MessageParser.java @@ -1,11 +1,11 @@ /* - * Copyright 2012, The Flogger Authors; 2023, 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 diff --git a/flogger/middleware/src/main/java/io/spine/logging/flogger/parser/ParseException.java b/flogger/middleware/src/main/java/io/spine/logging/flogger/parser/ParseException.java index 72d411237..4325ae5e7 100644 --- a/flogger/middleware/src/main/java/io/spine/logging/flogger/parser/ParseException.java +++ b/flogger/middleware/src/main/java/io/spine/logging/flogger/parser/ParseException.java @@ -1,11 +1,11 @@ /* - * Copyright 2012, The Flogger Authors; 2023, 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 diff --git a/flogger/middleware/src/main/java/io/spine/logging/flogger/parser/PrintfMessageParser.java b/flogger/middleware/src/main/java/io/spine/logging/flogger/parser/PrintfMessageParser.java index 16a31d2f8..7695e1c19 100644 --- a/flogger/middleware/src/main/java/io/spine/logging/flogger/parser/PrintfMessageParser.java +++ b/flogger/middleware/src/main/java/io/spine/logging/flogger/parser/PrintfMessageParser.java @@ -1,11 +1,11 @@ /* - * Copyright 2015, The Flogger Authors; 2023, 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 diff --git a/flogger/middleware/src/main/java/io/spine/logging/flogger/parser/package-info.java b/flogger/middleware/src/main/java/io/spine/logging/flogger/parser/package-info.java index 153bd9730..789547c6e 100644 --- a/flogger/middleware/src/main/java/io/spine/logging/flogger/parser/package-info.java +++ b/flogger/middleware/src/main/java/io/spine/logging/flogger/parser/package-info.java @@ -1,11 +1,11 @@ /* - * Copyright 2015, The Flogger Authors; 2023, 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 diff --git a/flogger/middleware/src/main/java/io/spine/logging/flogger/util/Checks.java b/flogger/middleware/src/main/java/io/spine/logging/flogger/util/Checks.java index 1aa9135e7..80b363a80 100644 --- a/flogger/middleware/src/main/java/io/spine/logging/flogger/util/Checks.java +++ b/flogger/middleware/src/main/java/io/spine/logging/flogger/util/Checks.java @@ -1,11 +1,11 @@ /* - * Copyright 2016, The Flogger Authors; 2023, 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 diff --git a/flogger/middleware/src/main/java/io/spine/logging/flogger/util/RecursionDepth.java b/flogger/middleware/src/main/java/io/spine/logging/flogger/util/RecursionDepth.java index ba7847f5f..906d3805e 100644 --- a/flogger/middleware/src/main/java/io/spine/logging/flogger/util/RecursionDepth.java +++ b/flogger/middleware/src/main/java/io/spine/logging/flogger/util/RecursionDepth.java @@ -1,11 +1,11 @@ /* - * Copyright 2021, The Flogger Authors; 2023, 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 diff --git a/flogger/middleware/src/main/java/io/spine/logging/flogger/util/package-info.java b/flogger/middleware/src/main/java/io/spine/logging/flogger/util/package-info.java index c3c67cc4d..1e53eeeb5 100644 --- a/flogger/middleware/src/main/java/io/spine/logging/flogger/util/package-info.java +++ b/flogger/middleware/src/main/java/io/spine/logging/flogger/util/package-info.java @@ -1,11 +1,11 @@ /* - * Copyright 2023, The Flogger Authors; 2023, 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 diff --git a/flogger/middleware/src/main/kotlin/io/spine/logging/flogger/FloggerMetadataKeys.kt b/flogger/middleware/src/main/kotlin/io/spine/logging/flogger/FloggerMetadataKeys.kt index 871b9acc8..06ce0f641 100644 --- a/flogger/middleware/src/main/kotlin/io/spine/logging/flogger/FloggerMetadataKeys.kt +++ b/flogger/middleware/src/main/kotlin/io/spine/logging/flogger/FloggerMetadataKeys.kt @@ -1,11 +1,11 @@ /* - * Copyright 2023, 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 diff --git a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/AbstractLoggerSpec.kt b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/AbstractLoggerSpec.kt index 4f4359f7d..9ba714229 100644 --- a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/AbstractLoggerSpec.kt +++ b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/AbstractLoggerSpec.kt @@ -1,11 +1,11 @@ /* - * Copyright 2023, 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 diff --git a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/CountingRateLimiterSpec.kt b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/CountingRateLimiterSpec.kt index 7b1561688..2f7bcba9e 100644 --- a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/CountingRateLimiterSpec.kt +++ b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/CountingRateLimiterSpec.kt @@ -1,11 +1,11 @@ /* - * Copyright 2023, 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 diff --git a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/DurationRateLimiterSpec.kt b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/DurationRateLimiterSpec.kt index 16db4c860..b4061fe73 100644 --- a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/DurationRateLimiterSpec.kt +++ b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/DurationRateLimiterSpec.kt @@ -1,11 +1,11 @@ /* - * Copyright 2023, 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 diff --git a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/FloggerLogSitesSpec.kt b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/FloggerLogSitesSpec.kt index 8e508c081..f716bf126 100644 --- a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/FloggerLogSitesSpec.kt +++ b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/FloggerLogSitesSpec.kt @@ -1,11 +1,11 @@ /* - * Copyright 2023, 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 diff --git a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/FloggerMetadataKeySpec.kt b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/FloggerMetadataKeySpec.kt index 5834028da..c7bd611b1 100644 --- a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/FloggerMetadataKeySpec.kt +++ b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/FloggerMetadataKeySpec.kt @@ -1,11 +1,11 @@ /* - * Copyright 2023, 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 diff --git a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/FluentLogger2Spec.kt b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/FluentLogger2Spec.kt index c88999b03..1d8fe3383 100644 --- a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/FluentLogger2Spec.kt +++ b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/FluentLogger2Spec.kt @@ -1,5 +1,5 @@ /* - * 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. diff --git a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/LogContextSpec.kt b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/LogContextSpec.kt index 00991f12f..ba5dc0163 100644 --- a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/LogContextSpec.kt +++ b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/LogContextSpec.kt @@ -1,11 +1,11 @@ /* - * Copyright 2023, 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 diff --git a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/LogPerBucketingStrategySpec.kt b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/LogPerBucketingStrategySpec.kt index e7e37e22a..2f347a353 100644 --- a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/LogPerBucketingStrategySpec.kt +++ b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/LogPerBucketingStrategySpec.kt @@ -1,11 +1,11 @@ /* - * Copyright 2023, 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 diff --git a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/LogSiteMapSpec.kt b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/LogSiteMapSpec.kt index 3ef5480fb..bc070a112 100644 --- a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/LogSiteMapSpec.kt +++ b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/LogSiteMapSpec.kt @@ -1,11 +1,11 @@ /* - * Copyright 2023, 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 diff --git a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/LogSiteStackTraceSpec.kt b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/LogSiteStackTraceSpec.kt index d80e43552..1a10f8e2e 100644 --- a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/LogSiteStackTraceSpec.kt +++ b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/LogSiteStackTraceSpec.kt @@ -1,11 +1,11 @@ /* - * Copyright 2023, 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 diff --git a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/LoggingScopeSpec.kt b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/LoggingScopeSpec.kt index ee17d81a7..4d4a5799c 100644 --- a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/LoggingScopeSpec.kt +++ b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/LoggingScopeSpec.kt @@ -1,11 +1,11 @@ /* - * Copyright 2023, 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 diff --git a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/RateLimitStatusSpec.kt b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/RateLimitStatusSpec.kt index b7c95ca0b..65fb74500 100644 --- a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/RateLimitStatusSpec.kt +++ b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/RateLimitStatusSpec.kt @@ -1,11 +1,11 @@ /* - * Copyright 2023, 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 diff --git a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/SamplingRateLimiterSpec.kt b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/SamplingRateLimiterSpec.kt index 5231d8abd..3ac32efdd 100644 --- a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/SamplingRateLimiterSpec.kt +++ b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/SamplingRateLimiterSpec.kt @@ -1,11 +1,11 @@ /* - * Copyright 2023, 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 diff --git a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/SpecializedLogSiteKeySpec.kt b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/SpecializedLogSiteKeySpec.kt index c3c3b6370..e9a8d4a93 100644 --- a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/SpecializedLogSiteKeySpec.kt +++ b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/SpecializedLogSiteKeySpec.kt @@ -1,11 +1,11 @@ /* - * Copyright 2023, 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 diff --git a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/StackBasedLogSiteSpec.kt b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/StackBasedLogSiteSpec.kt index a5b05a4a2..258203581 100644 --- a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/StackBasedLogSiteSpec.kt +++ b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/StackBasedLogSiteSpec.kt @@ -1,11 +1,11 @@ /* - * Copyright 2023, 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 diff --git a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/backend/BaseMessageFormatterSpec.kt b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/backend/BaseMessageFormatterSpec.kt index 0f5199332..3425437f1 100644 --- a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/backend/BaseMessageFormatterSpec.kt +++ b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/backend/BaseMessageFormatterSpec.kt @@ -1,11 +1,11 @@ /* - * Copyright 2023, 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 diff --git a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/backend/FormatCharSpec.kt b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/backend/FormatCharSpec.kt index 8b18e3e73..0d53bff45 100644 --- a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/backend/FormatCharSpec.kt +++ b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/backend/FormatCharSpec.kt @@ -1,11 +1,11 @@ /* - * Copyright 2023, 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 diff --git a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/backend/FormatOptionsSpec.kt b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/backend/FormatOptionsSpec.kt index fd88e8242..91b646fcb 100644 --- a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/backend/FormatOptionsSpec.kt +++ b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/backend/FormatOptionsSpec.kt @@ -1,11 +1,11 @@ /* - * Copyright 2023, 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 diff --git a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/backend/FormatTypeSpec.kt b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/backend/FormatTypeSpec.kt index ff70095b8..c5812cb1e 100644 --- a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/backend/FormatTypeSpec.kt +++ b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/backend/FormatTypeSpec.kt @@ -1,11 +1,11 @@ /* - * Copyright 2023, 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 diff --git a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/backend/KeyValueFormatterSpec.kt b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/backend/KeyValueFormatterSpec.kt index 5927d0346..1dc38a953 100644 --- a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/backend/KeyValueFormatterSpec.kt +++ b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/backend/KeyValueFormatterSpec.kt @@ -1,11 +1,11 @@ /* - * Copyright 2023, 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 diff --git a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/backend/LightweightProcessorSpec.kt b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/backend/LightweightProcessorSpec.kt index f2905bf6d..efac438b6 100644 --- a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/backend/LightweightProcessorSpec.kt +++ b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/backend/LightweightProcessorSpec.kt @@ -1,11 +1,11 @@ /* - * Copyright 2023, 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 diff --git a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/backend/MessageUtilsSpec.kt b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/backend/MessageUtilsSpec.kt index d6d6d58dd..88088d381 100644 --- a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/backend/MessageUtilsSpec.kt +++ b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/backend/MessageUtilsSpec.kt @@ -1,11 +1,11 @@ /* - * Copyright 2023, 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 diff --git a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/backend/MetadataHandlerSpec.kt b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/backend/MetadataHandlerSpec.kt index e4ba39254..023d158d9 100644 --- a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/backend/MetadataHandlerSpec.kt +++ b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/backend/MetadataHandlerSpec.kt @@ -1,11 +1,11 @@ /* - * Copyright 2023, 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 diff --git a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/backend/MetadataKeyValueHandlersSpec.kt b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/backend/MetadataKeyValueHandlersSpec.kt index f09cd3049..301a0a2b6 100644 --- a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/backend/MetadataKeyValueHandlersSpec.kt +++ b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/backend/MetadataKeyValueHandlersSpec.kt @@ -1,11 +1,11 @@ /* - * Copyright 2023, 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 diff --git a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/backend/MetadataProcessorSpec.kt b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/backend/MetadataProcessorSpec.kt index 2698efe26..3104fa644 100644 --- a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/backend/MetadataProcessorSpec.kt +++ b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/backend/MetadataProcessorSpec.kt @@ -1,11 +1,11 @@ /* - * Copyright 2023, 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 diff --git a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/backend/SimpleMessageFormatterSpec.kt b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/backend/SimpleMessageFormatterSpec.kt index 7e444ca21..f1c4b9e14 100644 --- a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/backend/SimpleMessageFormatterSpec.kt +++ b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/backend/SimpleMessageFormatterSpec.kt @@ -1,11 +1,11 @@ /* - * Copyright 2023, 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 diff --git a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/backend/SimpleProcessorSpec.kt b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/backend/SimpleProcessorSpec.kt index d141e24bd..9dd994ec2 100644 --- a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/backend/SimpleProcessorSpec.kt +++ b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/backend/SimpleProcessorSpec.kt @@ -1,11 +1,11 @@ /* - * Copyright 2023, 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 diff --git a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/backend/given/FakeLogData.kt b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/backend/given/FakeLogData.kt index ac94ca509..32532357c 100644 --- a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/backend/given/FakeLogData.kt +++ b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/backend/given/FakeLogData.kt @@ -1,11 +1,11 @@ /* - * Copyright 2023, 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 diff --git a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/backend/given/FakeMetadata.kt b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/backend/given/FakeMetadata.kt index 10bb5a816..a12e0cf36 100644 --- a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/backend/given/FakeMetadata.kt +++ b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/backend/given/FakeMetadata.kt @@ -1,11 +1,11 @@ /* - * Copyright 2023, 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 diff --git a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/backend/given/MemoizingLoggerBackend.kt b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/backend/given/MemoizingLoggerBackend.kt index a1c50407c..ae5c3e6ec 100644 --- a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/backend/given/MemoizingLoggerBackend.kt +++ b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/backend/given/MemoizingLoggerBackend.kt @@ -1,11 +1,11 @@ /* - * Copyright 2023, 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 diff --git a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/backend/given/MetadataAssertions.kt b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/backend/given/MetadataAssertions.kt index f714766ab..32fe7bd17 100644 --- a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/backend/given/MetadataAssertions.kt +++ b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/backend/given/MetadataAssertions.kt @@ -1,11 +1,11 @@ /* - * Copyright 2023, 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 diff --git a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/context/ContextMetadataSpec.kt b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/context/ContextMetadataSpec.kt index d374829d4..f6b9dd25c 100644 --- a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/context/ContextMetadataSpec.kt +++ b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/context/ContextMetadataSpec.kt @@ -1,11 +1,11 @@ /* - * Copyright 2023, 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 diff --git a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/context/LogLevelMapSpec.kt b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/context/LogLevelMapSpec.kt index 168aa399b..199892f41 100644 --- a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/context/LogLevelMapSpec.kt +++ b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/context/LogLevelMapSpec.kt @@ -1,11 +1,11 @@ /* - * Copyright 2023, 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 diff --git a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/context/ScopedLoggingContextSpec.kt b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/context/ScopedLoggingContextSpec.kt index f18e1c6dd..2bba8d24c 100644 --- a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/context/ScopedLoggingContextSpec.kt +++ b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/context/ScopedLoggingContextSpec.kt @@ -1,11 +1,11 @@ /* - * Copyright 2023, 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 diff --git a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/context/SegmentTrieSpec.kt b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/context/SegmentTrieSpec.kt index 391ba6933..09fabac6d 100644 --- a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/context/SegmentTrieSpec.kt +++ b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/context/SegmentTrieSpec.kt @@ -1,11 +1,11 @@ /* - * Copyright 2023, 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 diff --git a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/context/TagsSpec.kt b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/context/TagsSpec.kt index 258a1e92d..921888e31 100644 --- a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/context/TagsSpec.kt +++ b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/context/TagsSpec.kt @@ -1,11 +1,11 @@ /* - * Copyright 2023, 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 diff --git a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/given/BackendTestEnv.kt b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/given/BackendTestEnv.kt index 0b1c0a634..b13e05241 100644 --- a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/given/BackendTestEnv.kt +++ b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/given/BackendTestEnv.kt @@ -1,11 +1,11 @@ /* - * Copyright 2023, 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 diff --git a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/given/ConfigurableLogger.kt b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/given/ConfigurableLogger.kt index 9b6e0380b..461aaaf83 100644 --- a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/given/ConfigurableLogger.kt +++ b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/given/ConfigurableLogger.kt @@ -1,11 +1,11 @@ /* - * Copyright 2023, 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 diff --git a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/given/FakeLogSite.kt b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/given/FakeLogSite.kt index ec07a5d36..9a47da006 100644 --- a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/given/FakeLogSite.kt +++ b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/given/FakeLogSite.kt @@ -1,11 +1,11 @@ /* - * Copyright 2023, 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 diff --git a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/given/FormattingBackend.kt b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/given/FormattingBackend.kt index d7ccc632c..83162fd4f 100644 --- a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/given/FormattingBackend.kt +++ b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/given/FormattingBackend.kt @@ -1,11 +1,11 @@ /* - * Copyright 2023, 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 diff --git a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/given/LogDataAssertions.kt b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/given/LogDataAssertions.kt index f45616467..ba034f9c9 100644 --- a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/given/LogDataAssertions.kt +++ b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/given/LogDataAssertions.kt @@ -1,11 +1,11 @@ /* - * Copyright 2023, 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 diff --git a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/given/MemoizingKvHandler.kt b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/given/MemoizingKvHandler.kt index 72d12b921..ba8174c05 100644 --- a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/given/MemoizingKvHandler.kt +++ b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/given/MemoizingKvHandler.kt @@ -1,11 +1,11 @@ /* - * Copyright 2023, 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 diff --git a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/parameter/ParameterSpec.kt b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/parameter/ParameterSpec.kt index 75c2583e3..554793491 100644 --- a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/parameter/ParameterSpec.kt +++ b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/parameter/ParameterSpec.kt @@ -1,11 +1,11 @@ /* - * Copyright 2023, 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 diff --git a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/parameter/SimpleParameterSpec.kt b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/parameter/SimpleParameterSpec.kt index 584abceb8..89abeaae8 100644 --- a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/parameter/SimpleParameterSpec.kt +++ b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/parameter/SimpleParameterSpec.kt @@ -1,11 +1,11 @@ /* - * Copyright 2023, 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 diff --git a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/parser/BraceStyleMessageParserSpec.kt b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/parser/BraceStyleMessageParserSpec.kt index 856f74982..9860e4c27 100644 --- a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/parser/BraceStyleMessageParserSpec.kt +++ b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/parser/BraceStyleMessageParserSpec.kt @@ -1,11 +1,11 @@ /* - * Copyright 2023, 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 diff --git a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/parser/PrintfMessageParserSpec.kt b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/parser/PrintfMessageParserSpec.kt index c3a7f4736..9f295c2f8 100644 --- a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/parser/PrintfMessageParserSpec.kt +++ b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/parser/PrintfMessageParserSpec.kt @@ -1,11 +1,11 @@ /* - * Copyright 2023, 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 diff --git a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/parser/given/ParserTestEnv.kt b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/parser/given/ParserTestEnv.kt index 3afa7a6ce..265b250cb 100644 --- a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/parser/given/ParserTestEnv.kt +++ b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/parser/given/ParserTestEnv.kt @@ -1,11 +1,11 @@ /* - * Copyright 2023, 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 From 0522789fc27a87c0b5c89081202ceb3ea92abcce Mon Sep 17 00:00:00 2001 From: Alexander Yevsyukov Date: Wed, 25 Jun 2025 12:48:55 +0100 Subject: [PATCH 10/24] Restore mutual copyright statement --- .../src/main/java/io/spine/logging/flogger/AbstractLogger.java | 2 +- .../main/java/io/spine/logging/flogger/CountingRateLimiter.java | 2 +- .../main/java/io/spine/logging/flogger/DurationRateLimiter.java | 2 +- .../src/main/java/io/spine/logging/flogger/FloggerApi.java | 2 +- .../src/main/java/io/spine/logging/flogger/FloggerLogSite.java | 2 +- .../src/main/java/io/spine/logging/flogger/FloggerLogSites.java | 2 +- .../main/java/io/spine/logging/flogger/FloggerMetadataKey.java | 2 +- .../src/main/java/io/spine/logging/flogger/FluentLogger2.java | 2 +- .../src/main/java/io/spine/logging/flogger/LazyArg.java | 2 +- .../src/main/java/io/spine/logging/flogger/LazyArgs.java | 2 +- .../src/main/java/io/spine/logging/flogger/LogContext.java | 2 +- .../java/io/spine/logging/flogger/LogPerBucketingStrategy.java | 2 +- .../src/main/java/io/spine/logging/flogger/LogSiteKey.java | 2 +- .../src/main/java/io/spine/logging/flogger/LogSiteMap.java | 2 +- .../main/java/io/spine/logging/flogger/LogSiteStackTrace.java | 2 +- .../src/main/java/io/spine/logging/flogger/LoggingScope.java | 2 +- .../java/io/spine/logging/flogger/LoggingScopeProvider.java | 2 +- .../src/main/java/io/spine/logging/flogger/RateLimitStatus.java | 2 +- .../main/java/io/spine/logging/flogger/SamplingRateLimiter.java | 2 +- .../java/io/spine/logging/flogger/SpecializedLogSiteKey.java | 2 +- .../main/java/io/spine/logging/flogger/StackBasedLogSite.java | 2 +- .../src/main/java/io/spine/logging/flogger/StackSize.java | 2 +- .../java/io/spine/logging/flogger/backend/BackendFactory.java | 2 +- .../io/spine/logging/flogger/backend/BaseMessageFormatter.java | 2 +- .../src/main/java/io/spine/logging/flogger/backend/Clock.java | 2 +- .../main/java/io/spine/logging/flogger/backend/FormatChar.java | 2 +- .../java/io/spine/logging/flogger/backend/FormatOptions.java | 2 +- .../main/java/io/spine/logging/flogger/backend/FormatType.java | 2 +- .../io/spine/logging/flogger/backend/KeyValueFormatter.java | 2 +- .../src/main/java/io/spine/logging/flogger/backend/LogData.java | 2 +- .../io/spine/logging/flogger/backend/LogMessageFormatter.java | 2 +- .../java/io/spine/logging/flogger/backend/LoggerBackend.java | 2 +- .../java/io/spine/logging/flogger/backend/LoggingException.java | 2 +- .../java/io/spine/logging/flogger/backend/MessageUtils.java | 2 +- .../main/java/io/spine/logging/flogger/backend/Metadata.java | 2 +- .../java/io/spine/logging/flogger/backend/MetadataHandler.java | 2 +- .../spine/logging/flogger/backend/MetadataKeyValueHandlers.java | 2 +- .../io/spine/logging/flogger/backend/MetadataProcessor.java | 2 +- .../main/java/io/spine/logging/flogger/backend/Platform.java | 2 +- .../spine/logging/flogger/backend/SimpleMessageFormatter.java | 2 +- .../java/io/spine/logging/flogger/backend/TemplateContext.java | 2 +- .../java/io/spine/logging/flogger/backend/package-info.java | 2 +- .../io/spine/logging/flogger/context/ContextDataProvider.java | 2 +- .../java/io/spine/logging/flogger/context/ContextMetadata.java | 2 +- .../main/java/io/spine/logging/flogger/context/LogLevelMap.java | 2 +- .../spine/logging/flogger/context/NoOpContextDataProvider.java | 2 +- .../main/java/io/spine/logging/flogger/context/ScopeType.java | 2 +- .../io/spine/logging/flogger/context/ScopedLoggingContext.java | 2 +- .../io/spine/logging/flogger/context/ScopedLoggingContexts.java | 2 +- .../main/java/io/spine/logging/flogger/context/SegmentTrie.java | 2 +- .../src/main/java/io/spine/logging/flogger/context/Tags.java | 2 +- .../java/io/spine/logging/flogger/context/package-info.java | 2 +- .../src/main/java/io/spine/logging/flogger/package-info.java | 2 +- .../io/spine/logging/flogger/parameter/BraceStyleParameter.java | 2 +- .../java/io/spine/logging/flogger/parameter/DateTimeFormat.java | 2 +- .../io/spine/logging/flogger/parameter/DateTimeParameter.java | 2 +- .../main/java/io/spine/logging/flogger/parameter/Parameter.java | 2 +- .../io/spine/logging/flogger/parameter/ParameterVisitor.java | 2 +- .../io/spine/logging/flogger/parameter/SimpleParameter.java | 2 +- .../java/io/spine/logging/flogger/parameter/package-info.java | 2 +- .../spine/logging/flogger/parser/BraceStyleMessageParser.java | 2 +- .../logging/flogger/parser/DefaultBraceStyleMessageParser.java | 2 +- .../logging/flogger/parser/DefaultPrintfMessageParser.java | 2 +- .../java/io/spine/logging/flogger/parser/MessageBuilder.java | 2 +- .../java/io/spine/logging/flogger/parser/MessageParser.java | 2 +- .../java/io/spine/logging/flogger/parser/ParseException.java | 2 +- .../io/spine/logging/flogger/parser/PrintfMessageParser.java | 2 +- .../main/java/io/spine/logging/flogger/parser/package-info.java | 2 +- .../src/main/java/io/spine/logging/flogger/util/Checks.java | 2 +- .../main/java/io/spine/logging/flogger/util/RecursionDepth.java | 2 +- .../java/io/spine/logging/flogger/util/StaticMethodCaller.java | 2 +- .../main/java/io/spine/logging/flogger/util/package-info.java | 2 +- .../main/kotlin/io/spine/logging/flogger/FloggerMetadataKeys.kt | 2 +- .../test/kotlin/io/spine/logging/flogger/AbstractLoggerSpec.kt | 2 +- .../kotlin/io/spine/logging/flogger/CountingRateLimiterSpec.kt | 2 +- .../kotlin/io/spine/logging/flogger/DurationRateLimiterSpec.kt | 2 +- .../test/kotlin/io/spine/logging/flogger/FloggerLogSitesSpec.kt | 2 +- .../kotlin/io/spine/logging/flogger/FloggerMetadataKeySpec.kt | 2 +- .../test/kotlin/io/spine/logging/flogger/FluentLogger2Spec.kt | 2 +- .../src/test/kotlin/io/spine/logging/flogger/LogContextSpec.kt | 2 +- .../io/spine/logging/flogger/LogPerBucketingStrategySpec.kt | 2 +- .../src/test/kotlin/io/spine/logging/flogger/LogSiteMapSpec.kt | 2 +- .../kotlin/io/spine/logging/flogger/LogSiteStackTraceSpec.kt | 2 +- .../test/kotlin/io/spine/logging/flogger/LoggingScopeSpec.kt | 2 +- .../test/kotlin/io/spine/logging/flogger/RateLimitStatusSpec.kt | 2 +- .../kotlin/io/spine/logging/flogger/SamplingRateLimiterSpec.kt | 2 +- .../io/spine/logging/flogger/SpecializedLogSiteKeySpec.kt | 2 +- .../kotlin/io/spine/logging/flogger/StackBasedLogSiteSpec.kt | 2 +- .../spine/logging/flogger/backend/BaseMessageFormatterSpec.kt | 2 +- .../kotlin/io/spine/logging/flogger/backend/FormatCharSpec.kt | 2 +- .../io/spine/logging/flogger/backend/FormatOptionsSpec.kt | 2 +- .../kotlin/io/spine/logging/flogger/backend/FormatTypeSpec.kt | 2 +- .../io/spine/logging/flogger/backend/KeyValueFormatterSpec.kt | 2 +- .../spine/logging/flogger/backend/LightweightProcessorSpec.kt | 2 +- .../kotlin/io/spine/logging/flogger/backend/MessageUtilsSpec.kt | 2 +- .../io/spine/logging/flogger/backend/MetadataHandlerSpec.kt | 2 +- .../logging/flogger/backend/MetadataKeyValueHandlersSpec.kt | 2 +- .../io/spine/logging/flogger/backend/MetadataProcessorSpec.kt | 2 +- .../spine/logging/flogger/backend/SimpleMessageFormatterSpec.kt | 2 +- .../io/spine/logging/flogger/backend/SimpleProcessorSpec.kt | 2 +- .../io/spine/logging/flogger/backend/given/FakeLogData.kt | 2 +- .../io/spine/logging/flogger/backend/given/FakeMetadata.kt | 2 +- .../logging/flogger/backend/given/MemoizingLoggerBackend.kt | 2 +- .../spine/logging/flogger/backend/given/MetadataAssertions.kt | 2 +- .../logging/flogger/context/AbstractContextDataProviderSpec.kt | 2 +- .../io/spine/logging/flogger/context/ContextMetadataSpec.kt | 2 +- .../kotlin/io/spine/logging/flogger/context/LogLevelMapSpec.kt | 2 +- .../spine/logging/flogger/context/ScopedLoggingContextSpec.kt | 2 +- .../kotlin/io/spine/logging/flogger/context/SegmentTrieSpec.kt | 2 +- .../test/kotlin/io/spine/logging/flogger/context/TagsSpec.kt | 2 +- .../kotlin/io/spine/logging/flogger/given/BackendTestEnv.kt | 2 +- .../kotlin/io/spine/logging/flogger/given/ConfigurableLogger.kt | 2 +- .../test/kotlin/io/spine/logging/flogger/given/FakeLogSite.kt | 2 +- .../kotlin/io/spine/logging/flogger/given/FormattingBackend.kt | 2 +- .../kotlin/io/spine/logging/flogger/given/LogDataAssertions.kt | 2 +- .../kotlin/io/spine/logging/flogger/given/MemoizingKvHandler.kt | 2 +- .../kotlin/io/spine/logging/flogger/parameter/ParameterSpec.kt | 2 +- .../io/spine/logging/flogger/parameter/SimpleParameterSpec.kt | 2 +- .../spine/logging/flogger/parser/BraceStyleMessageParserSpec.kt | 2 +- .../flogger/parser/DefaultBraceStyleMessageParserSpec.kt | 2 +- .../logging/flogger/parser/DefaultPrintfMessageParserSpec.kt | 2 +- .../io/spine/logging/flogger/parser/PrintfMessageParserSpec.kt | 2 +- .../io/spine/logging/flogger/parser/given/ParserTestEnv.kt | 2 +- 123 files changed, 123 insertions(+), 123 deletions(-) diff --git a/flogger/middleware/src/main/java/io/spine/logging/flogger/AbstractLogger.java b/flogger/middleware/src/main/java/io/spine/logging/flogger/AbstractLogger.java index 4d8f0babd..aedfced67 100644 --- a/flogger/middleware/src/main/java/io/spine/logging/flogger/AbstractLogger.java +++ b/flogger/middleware/src/main/java/io/spine/logging/flogger/AbstractLogger.java @@ -1,5 +1,5 @@ /* - * Copyright 2025, TeamDev. All rights reserved. + * Copyright 2019, The Flogger Authors; 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. diff --git a/flogger/middleware/src/main/java/io/spine/logging/flogger/CountingRateLimiter.java b/flogger/middleware/src/main/java/io/spine/logging/flogger/CountingRateLimiter.java index 46d565f7c..bb2159c1b 100644 --- a/flogger/middleware/src/main/java/io/spine/logging/flogger/CountingRateLimiter.java +++ b/flogger/middleware/src/main/java/io/spine/logging/flogger/CountingRateLimiter.java @@ -1,5 +1,5 @@ /* - * Copyright 2025, TeamDev. All rights reserved. + * Copyright 2019, The Flogger Authors; 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. diff --git a/flogger/middleware/src/main/java/io/spine/logging/flogger/DurationRateLimiter.java b/flogger/middleware/src/main/java/io/spine/logging/flogger/DurationRateLimiter.java index fef6a39f4..84a6d0934 100644 --- a/flogger/middleware/src/main/java/io/spine/logging/flogger/DurationRateLimiter.java +++ b/flogger/middleware/src/main/java/io/spine/logging/flogger/DurationRateLimiter.java @@ -1,5 +1,5 @@ /* - * Copyright 2025, TeamDev. All rights reserved. + * Copyright 2019, The Flogger Authors; 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. diff --git a/flogger/middleware/src/main/java/io/spine/logging/flogger/FloggerApi.java b/flogger/middleware/src/main/java/io/spine/logging/flogger/FloggerApi.java index da4367012..11faeab92 100644 --- a/flogger/middleware/src/main/java/io/spine/logging/flogger/FloggerApi.java +++ b/flogger/middleware/src/main/java/io/spine/logging/flogger/FloggerApi.java @@ -1,5 +1,5 @@ /* - * Copyright 2025, TeamDev. All rights reserved. + * Copyright 2019, The Flogger Authors; 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. diff --git a/flogger/middleware/src/main/java/io/spine/logging/flogger/FloggerLogSite.java b/flogger/middleware/src/main/java/io/spine/logging/flogger/FloggerLogSite.java index 39056d4fb..e6a812470 100644 --- a/flogger/middleware/src/main/java/io/spine/logging/flogger/FloggerLogSite.java +++ b/flogger/middleware/src/main/java/io/spine/logging/flogger/FloggerLogSite.java @@ -1,5 +1,5 @@ /* - * Copyright 2025, TeamDev. All rights reserved. + * Copyright 2019, The Flogger Authors; 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. diff --git a/flogger/middleware/src/main/java/io/spine/logging/flogger/FloggerLogSites.java b/flogger/middleware/src/main/java/io/spine/logging/flogger/FloggerLogSites.java index 9ff766d0f..d519cde48 100644 --- a/flogger/middleware/src/main/java/io/spine/logging/flogger/FloggerLogSites.java +++ b/flogger/middleware/src/main/java/io/spine/logging/flogger/FloggerLogSites.java @@ -1,5 +1,5 @@ /* - * Copyright 2025, TeamDev. All rights reserved. + * Copyright 2019, The Flogger Authors; 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. diff --git a/flogger/middleware/src/main/java/io/spine/logging/flogger/FloggerMetadataKey.java b/flogger/middleware/src/main/java/io/spine/logging/flogger/FloggerMetadataKey.java index b92a5c775..96a94190f 100644 --- a/flogger/middleware/src/main/java/io/spine/logging/flogger/FloggerMetadataKey.java +++ b/flogger/middleware/src/main/java/io/spine/logging/flogger/FloggerMetadataKey.java @@ -1,5 +1,5 @@ /* - * Copyright 2025, TeamDev. All rights reserved. + * Copyright 2019, The Flogger Authors; 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. diff --git a/flogger/middleware/src/main/java/io/spine/logging/flogger/FluentLogger2.java b/flogger/middleware/src/main/java/io/spine/logging/flogger/FluentLogger2.java index fef287f41..b5af7288d 100644 --- a/flogger/middleware/src/main/java/io/spine/logging/flogger/FluentLogger2.java +++ b/flogger/middleware/src/main/java/io/spine/logging/flogger/FluentLogger2.java @@ -1,5 +1,5 @@ /* - * Copyright 2025, TeamDev. All rights reserved. + * Copyright 2019, The Flogger Authors; 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. diff --git a/flogger/middleware/src/main/java/io/spine/logging/flogger/LazyArg.java b/flogger/middleware/src/main/java/io/spine/logging/flogger/LazyArg.java index 05137dace..9656ac916 100644 --- a/flogger/middleware/src/main/java/io/spine/logging/flogger/LazyArg.java +++ b/flogger/middleware/src/main/java/io/spine/logging/flogger/LazyArg.java @@ -1,5 +1,5 @@ /* - * Copyright 2025, TeamDev. All rights reserved. + * Copyright 2019, The Flogger Authors; 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. diff --git a/flogger/middleware/src/main/java/io/spine/logging/flogger/LazyArgs.java b/flogger/middleware/src/main/java/io/spine/logging/flogger/LazyArgs.java index 3aa29e3cd..e15a50b72 100644 --- a/flogger/middleware/src/main/java/io/spine/logging/flogger/LazyArgs.java +++ b/flogger/middleware/src/main/java/io/spine/logging/flogger/LazyArgs.java @@ -1,5 +1,5 @@ /* - * Copyright 2025, TeamDev. All rights reserved. + * Copyright 2019, The Flogger Authors; 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. diff --git a/flogger/middleware/src/main/java/io/spine/logging/flogger/LogContext.java b/flogger/middleware/src/main/java/io/spine/logging/flogger/LogContext.java index ffba1222f..1721e1ab6 100644 --- a/flogger/middleware/src/main/java/io/spine/logging/flogger/LogContext.java +++ b/flogger/middleware/src/main/java/io/spine/logging/flogger/LogContext.java @@ -1,5 +1,5 @@ /* - * Copyright 2025, TeamDev. All rights reserved. + * Copyright 2019, The Flogger Authors; 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. diff --git a/flogger/middleware/src/main/java/io/spine/logging/flogger/LogPerBucketingStrategy.java b/flogger/middleware/src/main/java/io/spine/logging/flogger/LogPerBucketingStrategy.java index ebf807add..02872c122 100644 --- a/flogger/middleware/src/main/java/io/spine/logging/flogger/LogPerBucketingStrategy.java +++ b/flogger/middleware/src/main/java/io/spine/logging/flogger/LogPerBucketingStrategy.java @@ -1,5 +1,5 @@ /* - * Copyright 2025, TeamDev. All rights reserved. + * Copyright 2019, The Flogger Authors; 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. diff --git a/flogger/middleware/src/main/java/io/spine/logging/flogger/LogSiteKey.java b/flogger/middleware/src/main/java/io/spine/logging/flogger/LogSiteKey.java index cbe04ec06..e2c94a36d 100644 --- a/flogger/middleware/src/main/java/io/spine/logging/flogger/LogSiteKey.java +++ b/flogger/middleware/src/main/java/io/spine/logging/flogger/LogSiteKey.java @@ -1,5 +1,5 @@ /* - * Copyright 2025, TeamDev. All rights reserved. + * Copyright 2019, The Flogger Authors; 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. diff --git a/flogger/middleware/src/main/java/io/spine/logging/flogger/LogSiteMap.java b/flogger/middleware/src/main/java/io/spine/logging/flogger/LogSiteMap.java index d9acb39e6..cbd3509a2 100644 --- a/flogger/middleware/src/main/java/io/spine/logging/flogger/LogSiteMap.java +++ b/flogger/middleware/src/main/java/io/spine/logging/flogger/LogSiteMap.java @@ -1,5 +1,5 @@ /* - * Copyright 2025, TeamDev. All rights reserved. + * Copyright 2019, The Flogger Authors; 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. diff --git a/flogger/middleware/src/main/java/io/spine/logging/flogger/LogSiteStackTrace.java b/flogger/middleware/src/main/java/io/spine/logging/flogger/LogSiteStackTrace.java index 871d4312d..a4e41a47d 100644 --- a/flogger/middleware/src/main/java/io/spine/logging/flogger/LogSiteStackTrace.java +++ b/flogger/middleware/src/main/java/io/spine/logging/flogger/LogSiteStackTrace.java @@ -1,5 +1,5 @@ /* - * Copyright 2025, TeamDev. All rights reserved. + * Copyright 2019, The Flogger Authors; 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. diff --git a/flogger/middleware/src/main/java/io/spine/logging/flogger/LoggingScope.java b/flogger/middleware/src/main/java/io/spine/logging/flogger/LoggingScope.java index 84a46439c..781c87bd7 100644 --- a/flogger/middleware/src/main/java/io/spine/logging/flogger/LoggingScope.java +++ b/flogger/middleware/src/main/java/io/spine/logging/flogger/LoggingScope.java @@ -1,5 +1,5 @@ /* - * Copyright 2025, TeamDev. All rights reserved. + * Copyright 2019, The Flogger Authors; 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. diff --git a/flogger/middleware/src/main/java/io/spine/logging/flogger/LoggingScopeProvider.java b/flogger/middleware/src/main/java/io/spine/logging/flogger/LoggingScopeProvider.java index 77fb85ca7..1878604a6 100644 --- a/flogger/middleware/src/main/java/io/spine/logging/flogger/LoggingScopeProvider.java +++ b/flogger/middleware/src/main/java/io/spine/logging/flogger/LoggingScopeProvider.java @@ -1,5 +1,5 @@ /* - * Copyright 2025, TeamDev. All rights reserved. + * Copyright 2019, The Flogger Authors; 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. diff --git a/flogger/middleware/src/main/java/io/spine/logging/flogger/RateLimitStatus.java b/flogger/middleware/src/main/java/io/spine/logging/flogger/RateLimitStatus.java index e777b40ea..e787ff9dd 100644 --- a/flogger/middleware/src/main/java/io/spine/logging/flogger/RateLimitStatus.java +++ b/flogger/middleware/src/main/java/io/spine/logging/flogger/RateLimitStatus.java @@ -1,5 +1,5 @@ /* - * Copyright 2025, TeamDev. All rights reserved. + * Copyright 2019, The Flogger Authors; 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. diff --git a/flogger/middleware/src/main/java/io/spine/logging/flogger/SamplingRateLimiter.java b/flogger/middleware/src/main/java/io/spine/logging/flogger/SamplingRateLimiter.java index 75848b376..75b28a6d8 100644 --- a/flogger/middleware/src/main/java/io/spine/logging/flogger/SamplingRateLimiter.java +++ b/flogger/middleware/src/main/java/io/spine/logging/flogger/SamplingRateLimiter.java @@ -1,5 +1,5 @@ /* - * Copyright 2025, TeamDev. All rights reserved. + * Copyright 2019, The Flogger Authors; 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. diff --git a/flogger/middleware/src/main/java/io/spine/logging/flogger/SpecializedLogSiteKey.java b/flogger/middleware/src/main/java/io/spine/logging/flogger/SpecializedLogSiteKey.java index e4ba0fb6f..d35095c37 100644 --- a/flogger/middleware/src/main/java/io/spine/logging/flogger/SpecializedLogSiteKey.java +++ b/flogger/middleware/src/main/java/io/spine/logging/flogger/SpecializedLogSiteKey.java @@ -1,5 +1,5 @@ /* - * Copyright 2025, TeamDev. All rights reserved. + * Copyright 2019, The Flogger Authors; 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. diff --git a/flogger/middleware/src/main/java/io/spine/logging/flogger/StackBasedLogSite.java b/flogger/middleware/src/main/java/io/spine/logging/flogger/StackBasedLogSite.java index f778159c2..7501be161 100644 --- a/flogger/middleware/src/main/java/io/spine/logging/flogger/StackBasedLogSite.java +++ b/flogger/middleware/src/main/java/io/spine/logging/flogger/StackBasedLogSite.java @@ -1,5 +1,5 @@ /* - * Copyright 2025, TeamDev. All rights reserved. + * Copyright 2019, The Flogger Authors; 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. diff --git a/flogger/middleware/src/main/java/io/spine/logging/flogger/StackSize.java b/flogger/middleware/src/main/java/io/spine/logging/flogger/StackSize.java index dc71c7b83..52079bee2 100644 --- a/flogger/middleware/src/main/java/io/spine/logging/flogger/StackSize.java +++ b/flogger/middleware/src/main/java/io/spine/logging/flogger/StackSize.java @@ -1,5 +1,5 @@ /* - * Copyright 2025, TeamDev. All rights reserved. + * Copyright 2019, The Flogger Authors; 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. diff --git a/flogger/middleware/src/main/java/io/spine/logging/flogger/backend/BackendFactory.java b/flogger/middleware/src/main/java/io/spine/logging/flogger/backend/BackendFactory.java index 261db447c..78f946cc6 100644 --- a/flogger/middleware/src/main/java/io/spine/logging/flogger/backend/BackendFactory.java +++ b/flogger/middleware/src/main/java/io/spine/logging/flogger/backend/BackendFactory.java @@ -1,5 +1,5 @@ /* - * Copyright 2025, TeamDev. All rights reserved. + * Copyright 2019, The Flogger Authors; 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. diff --git a/flogger/middleware/src/main/java/io/spine/logging/flogger/backend/BaseMessageFormatter.java b/flogger/middleware/src/main/java/io/spine/logging/flogger/backend/BaseMessageFormatter.java index 213c223c3..40de09a34 100644 --- a/flogger/middleware/src/main/java/io/spine/logging/flogger/backend/BaseMessageFormatter.java +++ b/flogger/middleware/src/main/java/io/spine/logging/flogger/backend/BaseMessageFormatter.java @@ -1,5 +1,5 @@ /* - * Copyright 2025, TeamDev. All rights reserved. + * Copyright 2019, The Flogger Authors; 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. diff --git a/flogger/middleware/src/main/java/io/spine/logging/flogger/backend/Clock.java b/flogger/middleware/src/main/java/io/spine/logging/flogger/backend/Clock.java index bb2b72134..e1c7e36a1 100644 --- a/flogger/middleware/src/main/java/io/spine/logging/flogger/backend/Clock.java +++ b/flogger/middleware/src/main/java/io/spine/logging/flogger/backend/Clock.java @@ -1,5 +1,5 @@ /* - * Copyright 2025, TeamDev. All rights reserved. + * Copyright 2019, The Flogger Authors; 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. diff --git a/flogger/middleware/src/main/java/io/spine/logging/flogger/backend/FormatChar.java b/flogger/middleware/src/main/java/io/spine/logging/flogger/backend/FormatChar.java index 7df74f6ff..666d9383e 100644 --- a/flogger/middleware/src/main/java/io/spine/logging/flogger/backend/FormatChar.java +++ b/flogger/middleware/src/main/java/io/spine/logging/flogger/backend/FormatChar.java @@ -1,5 +1,5 @@ /* - * Copyright 2025, TeamDev. All rights reserved. + * Copyright 2019, The Flogger Authors; 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. diff --git a/flogger/middleware/src/main/java/io/spine/logging/flogger/backend/FormatOptions.java b/flogger/middleware/src/main/java/io/spine/logging/flogger/backend/FormatOptions.java index 64aafaebd..976b2ac88 100644 --- a/flogger/middleware/src/main/java/io/spine/logging/flogger/backend/FormatOptions.java +++ b/flogger/middleware/src/main/java/io/spine/logging/flogger/backend/FormatOptions.java @@ -1,5 +1,5 @@ /* - * Copyright 2025, TeamDev. All rights reserved. + * Copyright 2019, The Flogger Authors; 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. diff --git a/flogger/middleware/src/main/java/io/spine/logging/flogger/backend/FormatType.java b/flogger/middleware/src/main/java/io/spine/logging/flogger/backend/FormatType.java index f5b98bf1f..070046a7c 100644 --- a/flogger/middleware/src/main/java/io/spine/logging/flogger/backend/FormatType.java +++ b/flogger/middleware/src/main/java/io/spine/logging/flogger/backend/FormatType.java @@ -1,5 +1,5 @@ /* - * Copyright 2025, TeamDev. All rights reserved. + * Copyright 2019, The Flogger Authors; 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. diff --git a/flogger/middleware/src/main/java/io/spine/logging/flogger/backend/KeyValueFormatter.java b/flogger/middleware/src/main/java/io/spine/logging/flogger/backend/KeyValueFormatter.java index 288263bb2..d1f8c1b46 100644 --- a/flogger/middleware/src/main/java/io/spine/logging/flogger/backend/KeyValueFormatter.java +++ b/flogger/middleware/src/main/java/io/spine/logging/flogger/backend/KeyValueFormatter.java @@ -1,5 +1,5 @@ /* - * Copyright 2025, TeamDev. All rights reserved. + * Copyright 2019, The Flogger Authors; 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. diff --git a/flogger/middleware/src/main/java/io/spine/logging/flogger/backend/LogData.java b/flogger/middleware/src/main/java/io/spine/logging/flogger/backend/LogData.java index 7190fd393..1da9d3a26 100644 --- a/flogger/middleware/src/main/java/io/spine/logging/flogger/backend/LogData.java +++ b/flogger/middleware/src/main/java/io/spine/logging/flogger/backend/LogData.java @@ -1,5 +1,5 @@ /* - * Copyright 2025, TeamDev. All rights reserved. + * Copyright 2019, The Flogger Authors; 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. diff --git a/flogger/middleware/src/main/java/io/spine/logging/flogger/backend/LogMessageFormatter.java b/flogger/middleware/src/main/java/io/spine/logging/flogger/backend/LogMessageFormatter.java index 45e587e47..e01bd27b1 100644 --- a/flogger/middleware/src/main/java/io/spine/logging/flogger/backend/LogMessageFormatter.java +++ b/flogger/middleware/src/main/java/io/spine/logging/flogger/backend/LogMessageFormatter.java @@ -1,5 +1,5 @@ /* - * Copyright 2025, TeamDev. All rights reserved. + * Copyright 2019, The Flogger Authors; 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. diff --git a/flogger/middleware/src/main/java/io/spine/logging/flogger/backend/LoggerBackend.java b/flogger/middleware/src/main/java/io/spine/logging/flogger/backend/LoggerBackend.java index 2647dc1e3..7667ad015 100644 --- a/flogger/middleware/src/main/java/io/spine/logging/flogger/backend/LoggerBackend.java +++ b/flogger/middleware/src/main/java/io/spine/logging/flogger/backend/LoggerBackend.java @@ -1,5 +1,5 @@ /* - * Copyright 2025, TeamDev. All rights reserved. + * Copyright 2019, The Flogger Authors; 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. diff --git a/flogger/middleware/src/main/java/io/spine/logging/flogger/backend/LoggingException.java b/flogger/middleware/src/main/java/io/spine/logging/flogger/backend/LoggingException.java index 5a40dc160..689c5c7ac 100644 --- a/flogger/middleware/src/main/java/io/spine/logging/flogger/backend/LoggingException.java +++ b/flogger/middleware/src/main/java/io/spine/logging/flogger/backend/LoggingException.java @@ -1,5 +1,5 @@ /* - * Copyright 2025, TeamDev. All rights reserved. + * Copyright 2019, The Flogger Authors; 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. diff --git a/flogger/middleware/src/main/java/io/spine/logging/flogger/backend/MessageUtils.java b/flogger/middleware/src/main/java/io/spine/logging/flogger/backend/MessageUtils.java index 3e8519004..4c0aef23e 100644 --- a/flogger/middleware/src/main/java/io/spine/logging/flogger/backend/MessageUtils.java +++ b/flogger/middleware/src/main/java/io/spine/logging/flogger/backend/MessageUtils.java @@ -1,5 +1,5 @@ /* - * Copyright 2025, TeamDev. All rights reserved. + * Copyright 2019, The Flogger Authors; 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. diff --git a/flogger/middleware/src/main/java/io/spine/logging/flogger/backend/Metadata.java b/flogger/middleware/src/main/java/io/spine/logging/flogger/backend/Metadata.java index 8b563c440..0bbf5bcf8 100644 --- a/flogger/middleware/src/main/java/io/spine/logging/flogger/backend/Metadata.java +++ b/flogger/middleware/src/main/java/io/spine/logging/flogger/backend/Metadata.java @@ -1,5 +1,5 @@ /* - * Copyright 2025, TeamDev. All rights reserved. + * Copyright 2019, The Flogger Authors; 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. diff --git a/flogger/middleware/src/main/java/io/spine/logging/flogger/backend/MetadataHandler.java b/flogger/middleware/src/main/java/io/spine/logging/flogger/backend/MetadataHandler.java index 74ce92b7c..ae5fb384b 100644 --- a/flogger/middleware/src/main/java/io/spine/logging/flogger/backend/MetadataHandler.java +++ b/flogger/middleware/src/main/java/io/spine/logging/flogger/backend/MetadataHandler.java @@ -1,5 +1,5 @@ /* - * Copyright 2025, TeamDev. All rights reserved. + * Copyright 2019, The Flogger Authors; 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. diff --git a/flogger/middleware/src/main/java/io/spine/logging/flogger/backend/MetadataKeyValueHandlers.java b/flogger/middleware/src/main/java/io/spine/logging/flogger/backend/MetadataKeyValueHandlers.java index f4d9b93d9..296a6041f 100644 --- a/flogger/middleware/src/main/java/io/spine/logging/flogger/backend/MetadataKeyValueHandlers.java +++ b/flogger/middleware/src/main/java/io/spine/logging/flogger/backend/MetadataKeyValueHandlers.java @@ -1,5 +1,5 @@ /* - * Copyright 2025, TeamDev. All rights reserved. + * Copyright 2019, The Flogger Authors; 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. diff --git a/flogger/middleware/src/main/java/io/spine/logging/flogger/backend/MetadataProcessor.java b/flogger/middleware/src/main/java/io/spine/logging/flogger/backend/MetadataProcessor.java index 54abd3235..a7e813371 100644 --- a/flogger/middleware/src/main/java/io/spine/logging/flogger/backend/MetadataProcessor.java +++ b/flogger/middleware/src/main/java/io/spine/logging/flogger/backend/MetadataProcessor.java @@ -1,5 +1,5 @@ /* - * Copyright 2025, TeamDev. All rights reserved. + * Copyright 2019, The Flogger Authors; 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. diff --git a/flogger/middleware/src/main/java/io/spine/logging/flogger/backend/Platform.java b/flogger/middleware/src/main/java/io/spine/logging/flogger/backend/Platform.java index 4f39e2a19..15edf68be 100644 --- a/flogger/middleware/src/main/java/io/spine/logging/flogger/backend/Platform.java +++ b/flogger/middleware/src/main/java/io/spine/logging/flogger/backend/Platform.java @@ -1,5 +1,5 @@ /* - * Copyright 2025, TeamDev. All rights reserved. + * Copyright 2019, The Flogger Authors; 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. diff --git a/flogger/middleware/src/main/java/io/spine/logging/flogger/backend/SimpleMessageFormatter.java b/flogger/middleware/src/main/java/io/spine/logging/flogger/backend/SimpleMessageFormatter.java index ea0412841..0c32cea87 100644 --- a/flogger/middleware/src/main/java/io/spine/logging/flogger/backend/SimpleMessageFormatter.java +++ b/flogger/middleware/src/main/java/io/spine/logging/flogger/backend/SimpleMessageFormatter.java @@ -1,5 +1,5 @@ /* - * Copyright 2025, TeamDev. All rights reserved. + * Copyright 2019, The Flogger Authors; 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. diff --git a/flogger/middleware/src/main/java/io/spine/logging/flogger/backend/TemplateContext.java b/flogger/middleware/src/main/java/io/spine/logging/flogger/backend/TemplateContext.java index 07bd2a86c..ff736f87a 100644 --- a/flogger/middleware/src/main/java/io/spine/logging/flogger/backend/TemplateContext.java +++ b/flogger/middleware/src/main/java/io/spine/logging/flogger/backend/TemplateContext.java @@ -1,5 +1,5 @@ /* - * Copyright 2025, TeamDev. All rights reserved. + * Copyright 2019, The Flogger Authors; 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. diff --git a/flogger/middleware/src/main/java/io/spine/logging/flogger/backend/package-info.java b/flogger/middleware/src/main/java/io/spine/logging/flogger/backend/package-info.java index 2fa84fc7f..45d35bda1 100644 --- a/flogger/middleware/src/main/java/io/spine/logging/flogger/backend/package-info.java +++ b/flogger/middleware/src/main/java/io/spine/logging/flogger/backend/package-info.java @@ -1,5 +1,5 @@ /* - * Copyright 2025, TeamDev. All rights reserved. + * Copyright 2019, The Flogger Authors; 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. diff --git a/flogger/middleware/src/main/java/io/spine/logging/flogger/context/ContextDataProvider.java b/flogger/middleware/src/main/java/io/spine/logging/flogger/context/ContextDataProvider.java index df24dec99..f4bf7ab41 100644 --- a/flogger/middleware/src/main/java/io/spine/logging/flogger/context/ContextDataProvider.java +++ b/flogger/middleware/src/main/java/io/spine/logging/flogger/context/ContextDataProvider.java @@ -1,5 +1,5 @@ /* - * Copyright 2025, TeamDev. All rights reserved. + * Copyright 2019, The Flogger Authors; 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. diff --git a/flogger/middleware/src/main/java/io/spine/logging/flogger/context/ContextMetadata.java b/flogger/middleware/src/main/java/io/spine/logging/flogger/context/ContextMetadata.java index 0b910becc..a7dbc2e82 100644 --- a/flogger/middleware/src/main/java/io/spine/logging/flogger/context/ContextMetadata.java +++ b/flogger/middleware/src/main/java/io/spine/logging/flogger/context/ContextMetadata.java @@ -1,5 +1,5 @@ /* - * Copyright 2025, TeamDev. All rights reserved. + * Copyright 2019, The Flogger Authors; 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. diff --git a/flogger/middleware/src/main/java/io/spine/logging/flogger/context/LogLevelMap.java b/flogger/middleware/src/main/java/io/spine/logging/flogger/context/LogLevelMap.java index 9f9f5284e..520b950ba 100644 --- a/flogger/middleware/src/main/java/io/spine/logging/flogger/context/LogLevelMap.java +++ b/flogger/middleware/src/main/java/io/spine/logging/flogger/context/LogLevelMap.java @@ -1,5 +1,5 @@ /* - * Copyright 2025, TeamDev. All rights reserved. + * Copyright 2019, The Flogger Authors; 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. diff --git a/flogger/middleware/src/main/java/io/spine/logging/flogger/context/NoOpContextDataProvider.java b/flogger/middleware/src/main/java/io/spine/logging/flogger/context/NoOpContextDataProvider.java index 4e258ed43..f5b1b22c5 100644 --- a/flogger/middleware/src/main/java/io/spine/logging/flogger/context/NoOpContextDataProvider.java +++ b/flogger/middleware/src/main/java/io/spine/logging/flogger/context/NoOpContextDataProvider.java @@ -1,5 +1,5 @@ /* - * Copyright 2025, TeamDev. All rights reserved. + * Copyright 2019, The Flogger Authors; 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. diff --git a/flogger/middleware/src/main/java/io/spine/logging/flogger/context/ScopeType.java b/flogger/middleware/src/main/java/io/spine/logging/flogger/context/ScopeType.java index 82d1c9cfd..08fa94d29 100644 --- a/flogger/middleware/src/main/java/io/spine/logging/flogger/context/ScopeType.java +++ b/flogger/middleware/src/main/java/io/spine/logging/flogger/context/ScopeType.java @@ -1,5 +1,5 @@ /* - * Copyright 2025, TeamDev. All rights reserved. + * Copyright 2019, The Flogger Authors; 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. diff --git a/flogger/middleware/src/main/java/io/spine/logging/flogger/context/ScopedLoggingContext.java b/flogger/middleware/src/main/java/io/spine/logging/flogger/context/ScopedLoggingContext.java index 93354811b..cccae95bc 100644 --- a/flogger/middleware/src/main/java/io/spine/logging/flogger/context/ScopedLoggingContext.java +++ b/flogger/middleware/src/main/java/io/spine/logging/flogger/context/ScopedLoggingContext.java @@ -1,5 +1,5 @@ /* - * Copyright 2025, TeamDev. All rights reserved. + * Copyright 2019, The Flogger Authors; 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. diff --git a/flogger/middleware/src/main/java/io/spine/logging/flogger/context/ScopedLoggingContexts.java b/flogger/middleware/src/main/java/io/spine/logging/flogger/context/ScopedLoggingContexts.java index ce0c2c348..604937d39 100644 --- a/flogger/middleware/src/main/java/io/spine/logging/flogger/context/ScopedLoggingContexts.java +++ b/flogger/middleware/src/main/java/io/spine/logging/flogger/context/ScopedLoggingContexts.java @@ -1,5 +1,5 @@ /* - * Copyright 2025, TeamDev. All rights reserved. + * Copyright 2019, The Flogger Authors; 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. diff --git a/flogger/middleware/src/main/java/io/spine/logging/flogger/context/SegmentTrie.java b/flogger/middleware/src/main/java/io/spine/logging/flogger/context/SegmentTrie.java index 72169c55e..626ea1ac6 100644 --- a/flogger/middleware/src/main/java/io/spine/logging/flogger/context/SegmentTrie.java +++ b/flogger/middleware/src/main/java/io/spine/logging/flogger/context/SegmentTrie.java @@ -1,5 +1,5 @@ /* - * Copyright 2025, TeamDev. All rights reserved. + * Copyright 2019, The Flogger Authors; 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. diff --git a/flogger/middleware/src/main/java/io/spine/logging/flogger/context/Tags.java b/flogger/middleware/src/main/java/io/spine/logging/flogger/context/Tags.java index 61856f71b..f4f69f97b 100644 --- a/flogger/middleware/src/main/java/io/spine/logging/flogger/context/Tags.java +++ b/flogger/middleware/src/main/java/io/spine/logging/flogger/context/Tags.java @@ -1,5 +1,5 @@ /* - * Copyright 2025, TeamDev. All rights reserved. + * Copyright 2019, The Flogger Authors; 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. diff --git a/flogger/middleware/src/main/java/io/spine/logging/flogger/context/package-info.java b/flogger/middleware/src/main/java/io/spine/logging/flogger/context/package-info.java index e0b40a5c7..21877fa56 100644 --- a/flogger/middleware/src/main/java/io/spine/logging/flogger/context/package-info.java +++ b/flogger/middleware/src/main/java/io/spine/logging/flogger/context/package-info.java @@ -1,5 +1,5 @@ /* - * Copyright 2025, TeamDev. All rights reserved. + * Copyright 2019, The Flogger Authors; 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. diff --git a/flogger/middleware/src/main/java/io/spine/logging/flogger/package-info.java b/flogger/middleware/src/main/java/io/spine/logging/flogger/package-info.java index 54ab368a1..d0ef9c266 100644 --- a/flogger/middleware/src/main/java/io/spine/logging/flogger/package-info.java +++ b/flogger/middleware/src/main/java/io/spine/logging/flogger/package-info.java @@ -1,5 +1,5 @@ /* - * Copyright 2025, TeamDev. All rights reserved. + * Copyright 2019, The Flogger Authors; 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. diff --git a/flogger/middleware/src/main/java/io/spine/logging/flogger/parameter/BraceStyleParameter.java b/flogger/middleware/src/main/java/io/spine/logging/flogger/parameter/BraceStyleParameter.java index a3543b33b..aa460b7f8 100644 --- a/flogger/middleware/src/main/java/io/spine/logging/flogger/parameter/BraceStyleParameter.java +++ b/flogger/middleware/src/main/java/io/spine/logging/flogger/parameter/BraceStyleParameter.java @@ -1,5 +1,5 @@ /* - * Copyright 2025, TeamDev. All rights reserved. + * Copyright 2019, The Flogger Authors; 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. diff --git a/flogger/middleware/src/main/java/io/spine/logging/flogger/parameter/DateTimeFormat.java b/flogger/middleware/src/main/java/io/spine/logging/flogger/parameter/DateTimeFormat.java index 549a1560f..f23ed387a 100644 --- a/flogger/middleware/src/main/java/io/spine/logging/flogger/parameter/DateTimeFormat.java +++ b/flogger/middleware/src/main/java/io/spine/logging/flogger/parameter/DateTimeFormat.java @@ -1,5 +1,5 @@ /* - * Copyright 2025, TeamDev. All rights reserved. + * Copyright 2019, The Flogger Authors; 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. diff --git a/flogger/middleware/src/main/java/io/spine/logging/flogger/parameter/DateTimeParameter.java b/flogger/middleware/src/main/java/io/spine/logging/flogger/parameter/DateTimeParameter.java index 29838ef3f..bf5636618 100644 --- a/flogger/middleware/src/main/java/io/spine/logging/flogger/parameter/DateTimeParameter.java +++ b/flogger/middleware/src/main/java/io/spine/logging/flogger/parameter/DateTimeParameter.java @@ -1,5 +1,5 @@ /* - * Copyright 2025, TeamDev. All rights reserved. + * Copyright 2019, The Flogger Authors; 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. diff --git a/flogger/middleware/src/main/java/io/spine/logging/flogger/parameter/Parameter.java b/flogger/middleware/src/main/java/io/spine/logging/flogger/parameter/Parameter.java index 752d82c3e..78c05bbb3 100644 --- a/flogger/middleware/src/main/java/io/spine/logging/flogger/parameter/Parameter.java +++ b/flogger/middleware/src/main/java/io/spine/logging/flogger/parameter/Parameter.java @@ -1,5 +1,5 @@ /* - * Copyright 2025, TeamDev. All rights reserved. + * Copyright 2019, The Flogger Authors; 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. diff --git a/flogger/middleware/src/main/java/io/spine/logging/flogger/parameter/ParameterVisitor.java b/flogger/middleware/src/main/java/io/spine/logging/flogger/parameter/ParameterVisitor.java index 1f41dc74e..291a316a0 100644 --- a/flogger/middleware/src/main/java/io/spine/logging/flogger/parameter/ParameterVisitor.java +++ b/flogger/middleware/src/main/java/io/spine/logging/flogger/parameter/ParameterVisitor.java @@ -1,5 +1,5 @@ /* - * Copyright 2025, TeamDev. All rights reserved. + * Copyright 2019, The Flogger Authors; 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. diff --git a/flogger/middleware/src/main/java/io/spine/logging/flogger/parameter/SimpleParameter.java b/flogger/middleware/src/main/java/io/spine/logging/flogger/parameter/SimpleParameter.java index 6fac1a391..69919f55f 100644 --- a/flogger/middleware/src/main/java/io/spine/logging/flogger/parameter/SimpleParameter.java +++ b/flogger/middleware/src/main/java/io/spine/logging/flogger/parameter/SimpleParameter.java @@ -1,5 +1,5 @@ /* - * Copyright 2025, TeamDev. All rights reserved. + * Copyright 2019, The Flogger Authors; 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. diff --git a/flogger/middleware/src/main/java/io/spine/logging/flogger/parameter/package-info.java b/flogger/middleware/src/main/java/io/spine/logging/flogger/parameter/package-info.java index 2f117af41..a08befd89 100644 --- a/flogger/middleware/src/main/java/io/spine/logging/flogger/parameter/package-info.java +++ b/flogger/middleware/src/main/java/io/spine/logging/flogger/parameter/package-info.java @@ -1,5 +1,5 @@ /* - * Copyright 2025, TeamDev. All rights reserved. + * Copyright 2019, The Flogger Authors; 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. diff --git a/flogger/middleware/src/main/java/io/spine/logging/flogger/parser/BraceStyleMessageParser.java b/flogger/middleware/src/main/java/io/spine/logging/flogger/parser/BraceStyleMessageParser.java index 68ca59fb7..ae186c8ad 100644 --- a/flogger/middleware/src/main/java/io/spine/logging/flogger/parser/BraceStyleMessageParser.java +++ b/flogger/middleware/src/main/java/io/spine/logging/flogger/parser/BraceStyleMessageParser.java @@ -1,5 +1,5 @@ /* - * Copyright 2025, TeamDev. All rights reserved. + * Copyright 2019, The Flogger Authors; 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. diff --git a/flogger/middleware/src/main/java/io/spine/logging/flogger/parser/DefaultBraceStyleMessageParser.java b/flogger/middleware/src/main/java/io/spine/logging/flogger/parser/DefaultBraceStyleMessageParser.java index 230c6fd4b..188038418 100644 --- a/flogger/middleware/src/main/java/io/spine/logging/flogger/parser/DefaultBraceStyleMessageParser.java +++ b/flogger/middleware/src/main/java/io/spine/logging/flogger/parser/DefaultBraceStyleMessageParser.java @@ -1,5 +1,5 @@ /* - * Copyright 2025, TeamDev. All rights reserved. + * Copyright 2019, The Flogger Authors; 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. diff --git a/flogger/middleware/src/main/java/io/spine/logging/flogger/parser/DefaultPrintfMessageParser.java b/flogger/middleware/src/main/java/io/spine/logging/flogger/parser/DefaultPrintfMessageParser.java index 577074327..485d0933e 100644 --- a/flogger/middleware/src/main/java/io/spine/logging/flogger/parser/DefaultPrintfMessageParser.java +++ b/flogger/middleware/src/main/java/io/spine/logging/flogger/parser/DefaultPrintfMessageParser.java @@ -1,5 +1,5 @@ /* - * Copyright 2025, TeamDev. All rights reserved. + * Copyright 2019, The Flogger Authors; 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. diff --git a/flogger/middleware/src/main/java/io/spine/logging/flogger/parser/MessageBuilder.java b/flogger/middleware/src/main/java/io/spine/logging/flogger/parser/MessageBuilder.java index 2e7b762b1..74d100a8d 100644 --- a/flogger/middleware/src/main/java/io/spine/logging/flogger/parser/MessageBuilder.java +++ b/flogger/middleware/src/main/java/io/spine/logging/flogger/parser/MessageBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright 2025, TeamDev. All rights reserved. + * Copyright 2019, The Flogger Authors; 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. diff --git a/flogger/middleware/src/main/java/io/spine/logging/flogger/parser/MessageParser.java b/flogger/middleware/src/main/java/io/spine/logging/flogger/parser/MessageParser.java index 7e629dc43..92a2f48a8 100644 --- a/flogger/middleware/src/main/java/io/spine/logging/flogger/parser/MessageParser.java +++ b/flogger/middleware/src/main/java/io/spine/logging/flogger/parser/MessageParser.java @@ -1,5 +1,5 @@ /* - * Copyright 2025, TeamDev. All rights reserved. + * Copyright 2019, The Flogger Authors; 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. diff --git a/flogger/middleware/src/main/java/io/spine/logging/flogger/parser/ParseException.java b/flogger/middleware/src/main/java/io/spine/logging/flogger/parser/ParseException.java index 4325ae5e7..402f2ec20 100644 --- a/flogger/middleware/src/main/java/io/spine/logging/flogger/parser/ParseException.java +++ b/flogger/middleware/src/main/java/io/spine/logging/flogger/parser/ParseException.java @@ -1,5 +1,5 @@ /* - * Copyright 2025, TeamDev. All rights reserved. + * Copyright 2019, The Flogger Authors; 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. diff --git a/flogger/middleware/src/main/java/io/spine/logging/flogger/parser/PrintfMessageParser.java b/flogger/middleware/src/main/java/io/spine/logging/flogger/parser/PrintfMessageParser.java index 7695e1c19..6647eab25 100644 --- a/flogger/middleware/src/main/java/io/spine/logging/flogger/parser/PrintfMessageParser.java +++ b/flogger/middleware/src/main/java/io/spine/logging/flogger/parser/PrintfMessageParser.java @@ -1,5 +1,5 @@ /* - * Copyright 2025, TeamDev. All rights reserved. + * Copyright 2019, The Flogger Authors; 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. diff --git a/flogger/middleware/src/main/java/io/spine/logging/flogger/parser/package-info.java b/flogger/middleware/src/main/java/io/spine/logging/flogger/parser/package-info.java index 789547c6e..83d16a570 100644 --- a/flogger/middleware/src/main/java/io/spine/logging/flogger/parser/package-info.java +++ b/flogger/middleware/src/main/java/io/spine/logging/flogger/parser/package-info.java @@ -1,5 +1,5 @@ /* - * Copyright 2025, TeamDev. All rights reserved. + * Copyright 2019, The Flogger Authors; 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. diff --git a/flogger/middleware/src/main/java/io/spine/logging/flogger/util/Checks.java b/flogger/middleware/src/main/java/io/spine/logging/flogger/util/Checks.java index 80b363a80..51776c4bb 100644 --- a/flogger/middleware/src/main/java/io/spine/logging/flogger/util/Checks.java +++ b/flogger/middleware/src/main/java/io/spine/logging/flogger/util/Checks.java @@ -1,5 +1,5 @@ /* - * Copyright 2025, TeamDev. All rights reserved. + * Copyright 2019, The Flogger Authors; 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. diff --git a/flogger/middleware/src/main/java/io/spine/logging/flogger/util/RecursionDepth.java b/flogger/middleware/src/main/java/io/spine/logging/flogger/util/RecursionDepth.java index 906d3805e..b67165110 100644 --- a/flogger/middleware/src/main/java/io/spine/logging/flogger/util/RecursionDepth.java +++ b/flogger/middleware/src/main/java/io/spine/logging/flogger/util/RecursionDepth.java @@ -1,5 +1,5 @@ /* - * Copyright 2025, TeamDev. All rights reserved. + * Copyright 2019, The Flogger Authors; 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. diff --git a/flogger/middleware/src/main/java/io/spine/logging/flogger/util/StaticMethodCaller.java b/flogger/middleware/src/main/java/io/spine/logging/flogger/util/StaticMethodCaller.java index 9a09ef281..f0fc360e8 100644 --- a/flogger/middleware/src/main/java/io/spine/logging/flogger/util/StaticMethodCaller.java +++ b/flogger/middleware/src/main/java/io/spine/logging/flogger/util/StaticMethodCaller.java @@ -1,5 +1,5 @@ /* - * Copyright 2025, TeamDev. All rights reserved. + * Copyright 2019, The Flogger Authors; 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. diff --git a/flogger/middleware/src/main/java/io/spine/logging/flogger/util/package-info.java b/flogger/middleware/src/main/java/io/spine/logging/flogger/util/package-info.java index 1e53eeeb5..732a3b5ba 100644 --- a/flogger/middleware/src/main/java/io/spine/logging/flogger/util/package-info.java +++ b/flogger/middleware/src/main/java/io/spine/logging/flogger/util/package-info.java @@ -1,5 +1,5 @@ /* - * Copyright 2025, TeamDev. All rights reserved. + * Copyright 2019, The Flogger Authors; 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. diff --git a/flogger/middleware/src/main/kotlin/io/spine/logging/flogger/FloggerMetadataKeys.kt b/flogger/middleware/src/main/kotlin/io/spine/logging/flogger/FloggerMetadataKeys.kt index 06ce0f641..d02c8c135 100644 --- a/flogger/middleware/src/main/kotlin/io/spine/logging/flogger/FloggerMetadataKeys.kt +++ b/flogger/middleware/src/main/kotlin/io/spine/logging/flogger/FloggerMetadataKeys.kt @@ -1,5 +1,5 @@ /* - * Copyright 2025, TeamDev. All rights reserved. + * Copyright 2019, The Flogger Authors; 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. diff --git a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/AbstractLoggerSpec.kt b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/AbstractLoggerSpec.kt index 9ba714229..10ac151d8 100644 --- a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/AbstractLoggerSpec.kt +++ b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/AbstractLoggerSpec.kt @@ -1,5 +1,5 @@ /* - * Copyright 2025, TeamDev. All rights reserved. + * Copyright 2019, The Flogger Authors; 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. diff --git a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/CountingRateLimiterSpec.kt b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/CountingRateLimiterSpec.kt index 2f7bcba9e..8458bad06 100644 --- a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/CountingRateLimiterSpec.kt +++ b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/CountingRateLimiterSpec.kt @@ -1,5 +1,5 @@ /* - * Copyright 2025, TeamDev. All rights reserved. + * Copyright 2019, The Flogger Authors; 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. diff --git a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/DurationRateLimiterSpec.kt b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/DurationRateLimiterSpec.kt index b4061fe73..8d47cf2bc 100644 --- a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/DurationRateLimiterSpec.kt +++ b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/DurationRateLimiterSpec.kt @@ -1,5 +1,5 @@ /* - * Copyright 2025, TeamDev. All rights reserved. + * Copyright 2019, The Flogger Authors; 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. diff --git a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/FloggerLogSitesSpec.kt b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/FloggerLogSitesSpec.kt index f716bf126..e7b832008 100644 --- a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/FloggerLogSitesSpec.kt +++ b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/FloggerLogSitesSpec.kt @@ -1,5 +1,5 @@ /* - * Copyright 2025, TeamDev. All rights reserved. + * Copyright 2019, The Flogger Authors; 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. diff --git a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/FloggerMetadataKeySpec.kt b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/FloggerMetadataKeySpec.kt index c7bd611b1..73a0b532a 100644 --- a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/FloggerMetadataKeySpec.kt +++ b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/FloggerMetadataKeySpec.kt @@ -1,5 +1,5 @@ /* - * Copyright 2025, TeamDev. All rights reserved. + * Copyright 2019, The Flogger Authors; 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. diff --git a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/FluentLogger2Spec.kt b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/FluentLogger2Spec.kt index 1d8fe3383..87774be14 100644 --- a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/FluentLogger2Spec.kt +++ b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/FluentLogger2Spec.kt @@ -1,5 +1,5 @@ /* - * Copyright 2025, TeamDev. All rights reserved. + * Copyright 2019, The Flogger Authors; 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. diff --git a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/LogContextSpec.kt b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/LogContextSpec.kt index ba5dc0163..01b30bdcb 100644 --- a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/LogContextSpec.kt +++ b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/LogContextSpec.kt @@ -1,5 +1,5 @@ /* - * Copyright 2025, TeamDev. All rights reserved. + * Copyright 2019, The Flogger Authors; 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. diff --git a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/LogPerBucketingStrategySpec.kt b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/LogPerBucketingStrategySpec.kt index 2f347a353..28c4a7991 100644 --- a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/LogPerBucketingStrategySpec.kt +++ b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/LogPerBucketingStrategySpec.kt @@ -1,5 +1,5 @@ /* - * Copyright 2025, TeamDev. All rights reserved. + * Copyright 2019, The Flogger Authors; 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. diff --git a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/LogSiteMapSpec.kt b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/LogSiteMapSpec.kt index bc070a112..4155dc1f8 100644 --- a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/LogSiteMapSpec.kt +++ b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/LogSiteMapSpec.kt @@ -1,5 +1,5 @@ /* - * Copyright 2025, TeamDev. All rights reserved. + * Copyright 2019, The Flogger Authors; 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. diff --git a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/LogSiteStackTraceSpec.kt b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/LogSiteStackTraceSpec.kt index 1a10f8e2e..509d5a6f5 100644 --- a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/LogSiteStackTraceSpec.kt +++ b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/LogSiteStackTraceSpec.kt @@ -1,5 +1,5 @@ /* - * Copyright 2025, TeamDev. All rights reserved. + * Copyright 2019, The Flogger Authors; 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. diff --git a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/LoggingScopeSpec.kt b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/LoggingScopeSpec.kt index 4d4a5799c..5fa26222e 100644 --- a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/LoggingScopeSpec.kt +++ b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/LoggingScopeSpec.kt @@ -1,5 +1,5 @@ /* - * Copyright 2025, TeamDev. All rights reserved. + * Copyright 2019, The Flogger Authors; 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. diff --git a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/RateLimitStatusSpec.kt b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/RateLimitStatusSpec.kt index 65fb74500..11f12340c 100644 --- a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/RateLimitStatusSpec.kt +++ b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/RateLimitStatusSpec.kt @@ -1,5 +1,5 @@ /* - * Copyright 2025, TeamDev. All rights reserved. + * Copyright 2019, The Flogger Authors; 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. diff --git a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/SamplingRateLimiterSpec.kt b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/SamplingRateLimiterSpec.kt index 3ac32efdd..0269cf0b8 100644 --- a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/SamplingRateLimiterSpec.kt +++ b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/SamplingRateLimiterSpec.kt @@ -1,5 +1,5 @@ /* - * Copyright 2025, TeamDev. All rights reserved. + * Copyright 2019, The Flogger Authors; 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. diff --git a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/SpecializedLogSiteKeySpec.kt b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/SpecializedLogSiteKeySpec.kt index e9a8d4a93..ea0ae4f28 100644 --- a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/SpecializedLogSiteKeySpec.kt +++ b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/SpecializedLogSiteKeySpec.kt @@ -1,5 +1,5 @@ /* - * Copyright 2025, TeamDev. All rights reserved. + * Copyright 2019, The Flogger Authors; 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. diff --git a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/StackBasedLogSiteSpec.kt b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/StackBasedLogSiteSpec.kt index 258203581..5d7a86e64 100644 --- a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/StackBasedLogSiteSpec.kt +++ b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/StackBasedLogSiteSpec.kt @@ -1,5 +1,5 @@ /* - * Copyright 2025, TeamDev. All rights reserved. + * Copyright 2019, The Flogger Authors; 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. diff --git a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/backend/BaseMessageFormatterSpec.kt b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/backend/BaseMessageFormatterSpec.kt index 3425437f1..b089f8565 100644 --- a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/backend/BaseMessageFormatterSpec.kt +++ b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/backend/BaseMessageFormatterSpec.kt @@ -1,5 +1,5 @@ /* - * Copyright 2025, TeamDev. All rights reserved. + * Copyright 2019, The Flogger Authors; 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. diff --git a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/backend/FormatCharSpec.kt b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/backend/FormatCharSpec.kt index 0d53bff45..8efe1bf8b 100644 --- a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/backend/FormatCharSpec.kt +++ b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/backend/FormatCharSpec.kt @@ -1,5 +1,5 @@ /* - * Copyright 2025, TeamDev. All rights reserved. + * Copyright 2019, The Flogger Authors; 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. diff --git a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/backend/FormatOptionsSpec.kt b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/backend/FormatOptionsSpec.kt index 91b646fcb..003dfcde2 100644 --- a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/backend/FormatOptionsSpec.kt +++ b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/backend/FormatOptionsSpec.kt @@ -1,5 +1,5 @@ /* - * Copyright 2025, TeamDev. All rights reserved. + * Copyright 2019, The Flogger Authors; 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. diff --git a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/backend/FormatTypeSpec.kt b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/backend/FormatTypeSpec.kt index c5812cb1e..0a977f9ce 100644 --- a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/backend/FormatTypeSpec.kt +++ b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/backend/FormatTypeSpec.kt @@ -1,5 +1,5 @@ /* - * Copyright 2025, TeamDev. All rights reserved. + * Copyright 2019, The Flogger Authors; 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. diff --git a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/backend/KeyValueFormatterSpec.kt b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/backend/KeyValueFormatterSpec.kt index 1dc38a953..9c0272e54 100644 --- a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/backend/KeyValueFormatterSpec.kt +++ b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/backend/KeyValueFormatterSpec.kt @@ -1,5 +1,5 @@ /* - * Copyright 2025, TeamDev. All rights reserved. + * Copyright 2019, The Flogger Authors; 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. diff --git a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/backend/LightweightProcessorSpec.kt b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/backend/LightweightProcessorSpec.kt index efac438b6..ea5abe351 100644 --- a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/backend/LightweightProcessorSpec.kt +++ b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/backend/LightweightProcessorSpec.kt @@ -1,5 +1,5 @@ /* - * Copyright 2025, TeamDev. All rights reserved. + * Copyright 2019, The Flogger Authors; 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. diff --git a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/backend/MessageUtilsSpec.kt b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/backend/MessageUtilsSpec.kt index 88088d381..8fb1ffded 100644 --- a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/backend/MessageUtilsSpec.kt +++ b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/backend/MessageUtilsSpec.kt @@ -1,5 +1,5 @@ /* - * Copyright 2025, TeamDev. All rights reserved. + * Copyright 2019, The Flogger Authors; 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. diff --git a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/backend/MetadataHandlerSpec.kt b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/backend/MetadataHandlerSpec.kt index 023d158d9..34be07013 100644 --- a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/backend/MetadataHandlerSpec.kt +++ b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/backend/MetadataHandlerSpec.kt @@ -1,5 +1,5 @@ /* - * Copyright 2025, TeamDev. All rights reserved. + * Copyright 2019, The Flogger Authors; 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. diff --git a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/backend/MetadataKeyValueHandlersSpec.kt b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/backend/MetadataKeyValueHandlersSpec.kt index 301a0a2b6..5d7e39cdc 100644 --- a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/backend/MetadataKeyValueHandlersSpec.kt +++ b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/backend/MetadataKeyValueHandlersSpec.kt @@ -1,5 +1,5 @@ /* - * Copyright 2025, TeamDev. All rights reserved. + * Copyright 2019, The Flogger Authors; 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. diff --git a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/backend/MetadataProcessorSpec.kt b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/backend/MetadataProcessorSpec.kt index 3104fa644..71276d141 100644 --- a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/backend/MetadataProcessorSpec.kt +++ b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/backend/MetadataProcessorSpec.kt @@ -1,5 +1,5 @@ /* - * Copyright 2025, TeamDev. All rights reserved. + * Copyright 2019, The Flogger Authors; 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. diff --git a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/backend/SimpleMessageFormatterSpec.kt b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/backend/SimpleMessageFormatterSpec.kt index f1c4b9e14..94b150391 100644 --- a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/backend/SimpleMessageFormatterSpec.kt +++ b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/backend/SimpleMessageFormatterSpec.kt @@ -1,5 +1,5 @@ /* - * Copyright 2025, TeamDev. All rights reserved. + * Copyright 2019, The Flogger Authors; 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. diff --git a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/backend/SimpleProcessorSpec.kt b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/backend/SimpleProcessorSpec.kt index 9dd994ec2..f69b698d1 100644 --- a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/backend/SimpleProcessorSpec.kt +++ b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/backend/SimpleProcessorSpec.kt @@ -1,5 +1,5 @@ /* - * Copyright 2025, TeamDev. All rights reserved. + * Copyright 2019, The Flogger Authors; 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. diff --git a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/backend/given/FakeLogData.kt b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/backend/given/FakeLogData.kt index 32532357c..e6c7b5550 100644 --- a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/backend/given/FakeLogData.kt +++ b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/backend/given/FakeLogData.kt @@ -1,5 +1,5 @@ /* - * Copyright 2025, TeamDev. All rights reserved. + * Copyright 2019, The Flogger Authors; 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. diff --git a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/backend/given/FakeMetadata.kt b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/backend/given/FakeMetadata.kt index a12e0cf36..911c16ac0 100644 --- a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/backend/given/FakeMetadata.kt +++ b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/backend/given/FakeMetadata.kt @@ -1,5 +1,5 @@ /* - * Copyright 2025, TeamDev. All rights reserved. + * Copyright 2019, The Flogger Authors; 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. diff --git a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/backend/given/MemoizingLoggerBackend.kt b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/backend/given/MemoizingLoggerBackend.kt index ae5c3e6ec..358a1d715 100644 --- a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/backend/given/MemoizingLoggerBackend.kt +++ b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/backend/given/MemoizingLoggerBackend.kt @@ -1,5 +1,5 @@ /* - * Copyright 2025, TeamDev. All rights reserved. + * Copyright 2019, The Flogger Authors; 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. diff --git a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/backend/given/MetadataAssertions.kt b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/backend/given/MetadataAssertions.kt index 32fe7bd17..2093933e4 100644 --- a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/backend/given/MetadataAssertions.kt +++ b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/backend/given/MetadataAssertions.kt @@ -1,5 +1,5 @@ /* - * Copyright 2025, TeamDev. All rights reserved. + * Copyright 2019, The Flogger Authors; 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. diff --git a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/context/AbstractContextDataProviderSpec.kt b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/context/AbstractContextDataProviderSpec.kt index c19e1b1b0..041759547 100644 --- a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/context/AbstractContextDataProviderSpec.kt +++ b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/context/AbstractContextDataProviderSpec.kt @@ -1,5 +1,5 @@ /* - * Copyright 2025, TeamDev. All rights reserved. + * Copyright 2019, The Flogger Authors; 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. diff --git a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/context/ContextMetadataSpec.kt b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/context/ContextMetadataSpec.kt index f6b9dd25c..9e61f3b11 100644 --- a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/context/ContextMetadataSpec.kt +++ b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/context/ContextMetadataSpec.kt @@ -1,5 +1,5 @@ /* - * Copyright 2025, TeamDev. All rights reserved. + * Copyright 2019, The Flogger Authors; 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. diff --git a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/context/LogLevelMapSpec.kt b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/context/LogLevelMapSpec.kt index 199892f41..11cc5b64e 100644 --- a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/context/LogLevelMapSpec.kt +++ b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/context/LogLevelMapSpec.kt @@ -1,5 +1,5 @@ /* - * Copyright 2025, TeamDev. All rights reserved. + * Copyright 2019, The Flogger Authors; 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. diff --git a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/context/ScopedLoggingContextSpec.kt b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/context/ScopedLoggingContextSpec.kt index 2bba8d24c..6350a0c85 100644 --- a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/context/ScopedLoggingContextSpec.kt +++ b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/context/ScopedLoggingContextSpec.kt @@ -1,5 +1,5 @@ /* - * Copyright 2025, TeamDev. All rights reserved. + * Copyright 2019, The Flogger Authors; 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. diff --git a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/context/SegmentTrieSpec.kt b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/context/SegmentTrieSpec.kt index 09fabac6d..01012da16 100644 --- a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/context/SegmentTrieSpec.kt +++ b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/context/SegmentTrieSpec.kt @@ -1,5 +1,5 @@ /* - * Copyright 2025, TeamDev. All rights reserved. + * Copyright 2019, The Flogger Authors; 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. diff --git a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/context/TagsSpec.kt b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/context/TagsSpec.kt index 921888e31..b6be5f307 100644 --- a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/context/TagsSpec.kt +++ b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/context/TagsSpec.kt @@ -1,5 +1,5 @@ /* - * Copyright 2025, TeamDev. All rights reserved. + * Copyright 2019, The Flogger Authors; 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. diff --git a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/given/BackendTestEnv.kt b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/given/BackendTestEnv.kt index b13e05241..bb0d6f252 100644 --- a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/given/BackendTestEnv.kt +++ b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/given/BackendTestEnv.kt @@ -1,5 +1,5 @@ /* - * Copyright 2025, TeamDev. All rights reserved. + * Copyright 2019, The Flogger Authors; 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. diff --git a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/given/ConfigurableLogger.kt b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/given/ConfigurableLogger.kt index 461aaaf83..83510b8ec 100644 --- a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/given/ConfigurableLogger.kt +++ b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/given/ConfigurableLogger.kt @@ -1,5 +1,5 @@ /* - * Copyright 2025, TeamDev. All rights reserved. + * Copyright 2019, The Flogger Authors; 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. diff --git a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/given/FakeLogSite.kt b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/given/FakeLogSite.kt index 9a47da006..5ffe80382 100644 --- a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/given/FakeLogSite.kt +++ b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/given/FakeLogSite.kt @@ -1,5 +1,5 @@ /* - * Copyright 2025, TeamDev. All rights reserved. + * Copyright 2019, The Flogger Authors; 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. diff --git a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/given/FormattingBackend.kt b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/given/FormattingBackend.kt index 83162fd4f..2175a7d19 100644 --- a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/given/FormattingBackend.kt +++ b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/given/FormattingBackend.kt @@ -1,5 +1,5 @@ /* - * Copyright 2025, TeamDev. All rights reserved. + * Copyright 2019, The Flogger Authors; 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. diff --git a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/given/LogDataAssertions.kt b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/given/LogDataAssertions.kt index ba034f9c9..3da1004c1 100644 --- a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/given/LogDataAssertions.kt +++ b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/given/LogDataAssertions.kt @@ -1,5 +1,5 @@ /* - * Copyright 2025, TeamDev. All rights reserved. + * Copyright 2019, The Flogger Authors; 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. diff --git a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/given/MemoizingKvHandler.kt b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/given/MemoizingKvHandler.kt index ba8174c05..4af386119 100644 --- a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/given/MemoizingKvHandler.kt +++ b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/given/MemoizingKvHandler.kt @@ -1,5 +1,5 @@ /* - * Copyright 2025, TeamDev. All rights reserved. + * Copyright 2019, The Flogger Authors; 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. diff --git a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/parameter/ParameterSpec.kt b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/parameter/ParameterSpec.kt index 554793491..09adf63e7 100644 --- a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/parameter/ParameterSpec.kt +++ b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/parameter/ParameterSpec.kt @@ -1,5 +1,5 @@ /* - * Copyright 2025, TeamDev. All rights reserved. + * Copyright 2019, The Flogger Authors; 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. diff --git a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/parameter/SimpleParameterSpec.kt b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/parameter/SimpleParameterSpec.kt index 89abeaae8..e4b2d2fb6 100644 --- a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/parameter/SimpleParameterSpec.kt +++ b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/parameter/SimpleParameterSpec.kt @@ -1,5 +1,5 @@ /* - * Copyright 2025, TeamDev. All rights reserved. + * Copyright 2019, The Flogger Authors; 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. diff --git a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/parser/BraceStyleMessageParserSpec.kt b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/parser/BraceStyleMessageParserSpec.kt index 9860e4c27..53cadb205 100644 --- a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/parser/BraceStyleMessageParserSpec.kt +++ b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/parser/BraceStyleMessageParserSpec.kt @@ -1,5 +1,5 @@ /* - * Copyright 2025, TeamDev. All rights reserved. + * Copyright 2019, The Flogger Authors; 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. diff --git a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/parser/DefaultBraceStyleMessageParserSpec.kt b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/parser/DefaultBraceStyleMessageParserSpec.kt index 193ac8365..9bbd2cbea 100644 --- a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/parser/DefaultBraceStyleMessageParserSpec.kt +++ b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/parser/DefaultBraceStyleMessageParserSpec.kt @@ -1,5 +1,5 @@ /* - * Copyright 2025, TeamDev. All rights reserved. + * Copyright 2019, The Flogger Authors; 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. diff --git a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/parser/DefaultPrintfMessageParserSpec.kt b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/parser/DefaultPrintfMessageParserSpec.kt index e10a71436..a8d357a46 100644 --- a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/parser/DefaultPrintfMessageParserSpec.kt +++ b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/parser/DefaultPrintfMessageParserSpec.kt @@ -1,5 +1,5 @@ /* - * Copyright 2025, TeamDev. All rights reserved. + * Copyright 2019, The Flogger Authors; 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. diff --git a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/parser/PrintfMessageParserSpec.kt b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/parser/PrintfMessageParserSpec.kt index 9f295c2f8..30ef32ac3 100644 --- a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/parser/PrintfMessageParserSpec.kt +++ b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/parser/PrintfMessageParserSpec.kt @@ -1,5 +1,5 @@ /* - * Copyright 2025, TeamDev. All rights reserved. + * Copyright 2019, The Flogger Authors; 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. diff --git a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/parser/given/ParserTestEnv.kt b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/parser/given/ParserTestEnv.kt index 265b250cb..2b57791b7 100644 --- a/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/parser/given/ParserTestEnv.kt +++ b/flogger/middleware/src/test/kotlin/io/spine/logging/flogger/parser/given/ParserTestEnv.kt @@ -1,5 +1,5 @@ /* - * Copyright 2025, TeamDev. All rights reserved. + * Copyright 2019, The Flogger Authors; 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. From 49e7188dcb8a6f485946c978197a5d3421b0373b Mon Sep 17 00:00:00 2001 From: Alexander Yevsyukov Date: Wed, 25 Jun 2025 12:49:39 +0100 Subject: [PATCH 11/24] Restore mutual copyright statement --- .../test/java/io/spine/logging/backend/given/BadToString.java | 2 +- .../test/java/io/spine/logging/backend/given/package-info.java | 2 +- .../logging/backend/generator/PlatformProviderGenerator.java | 2 +- .../java/io/spine/logging/backend/generator/package-info.java | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/flogger/middleware/src/test/java/io/spine/logging/backend/given/BadToString.java b/flogger/middleware/src/test/java/io/spine/logging/backend/given/BadToString.java index 9f95481e5..60de36131 100644 --- a/flogger/middleware/src/test/java/io/spine/logging/backend/given/BadToString.java +++ b/flogger/middleware/src/test/java/io/spine/logging/backend/given/BadToString.java @@ -1,5 +1,5 @@ /* - * Copyright 2025, TeamDev. All rights reserved. + * Copyright 2019, The Flogger Authors; 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. diff --git a/flogger/middleware/src/test/java/io/spine/logging/backend/given/package-info.java b/flogger/middleware/src/test/java/io/spine/logging/backend/given/package-info.java index 081723ae7..0092a372b 100644 --- a/flogger/middleware/src/test/java/io/spine/logging/backend/given/package-info.java +++ b/flogger/middleware/src/test/java/io/spine/logging/backend/given/package-info.java @@ -1,5 +1,5 @@ /* - * Copyright 2023, TeamDev. All rights reserved. + * Copyright 2019, The Flogger Authors; 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. diff --git a/flogger/platform-generator/src/main/java/io/spine/logging/backend/generator/PlatformProviderGenerator.java b/flogger/platform-generator/src/main/java/io/spine/logging/backend/generator/PlatformProviderGenerator.java index b92789c74..3e8056125 100644 --- a/flogger/platform-generator/src/main/java/io/spine/logging/backend/generator/PlatformProviderGenerator.java +++ b/flogger/platform-generator/src/main/java/io/spine/logging/backend/generator/PlatformProviderGenerator.java @@ -1,5 +1,5 @@ /* - * Copyright 2018, The Flogger Authors; 2023, TeamDev. All rights reserved. + * Copyright 2019, The Flogger Authors; 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. diff --git a/flogger/platform-generator/src/main/java/io/spine/logging/backend/generator/package-info.java b/flogger/platform-generator/src/main/java/io/spine/logging/backend/generator/package-info.java index 601849ec4..0a628f6ea 100644 --- a/flogger/platform-generator/src/main/java/io/spine/logging/backend/generator/package-info.java +++ b/flogger/platform-generator/src/main/java/io/spine/logging/backend/generator/package-info.java @@ -1,5 +1,5 @@ /* - * Copyright 2023, TeamDev. All rights reserved. + * Copyright 2019, The Flogger Authors; 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. From 175a61f30edc1e690774466028942b851a0541e4 Mon Sep 17 00:00:00 2001 From: Alexander Yevsyukov Date: Wed, 25 Jun 2025 12:52:53 +0100 Subject: [PATCH 12/24] Update dependency reports --- dependencies.md | 34 +++++++++++++++++----------------- pom.xml | 28 +--------------------------- 2 files changed, 18 insertions(+), 44 deletions(-) diff --git a/dependencies.md b/dependencies.md index c19e0e8f3..abbb2e7b3 100644 --- a/dependencies.md +++ b/dependencies.md @@ -724,7 +724,7 @@ The dependencies distributed under several licenses, are used according their commercial-use-friendly license. -This report was generated on **Wed Jun 25 12:42:56 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). +This report was generated on **Wed Jun 25 12:49:51 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). @@ -1553,7 +1553,7 @@ This report was generated on **Wed Jun 25 12:42:56 WEST 2025** using [Gradle-Lic The dependencies distributed under several licenses, are used according their commercial-use-friendly license. -This report was generated on **Wed Jun 25 12:42:56 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). +This report was generated on **Wed Jun 25 12:49:52 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). @@ -2366,7 +2366,7 @@ This report was generated on **Wed Jun 25 12:42:56 WEST 2025** using [Gradle-Lic The dependencies distributed under several licenses, are used according their commercial-use-friendly license. -This report was generated on **Wed Jun 25 12:42:57 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). +This report was generated on **Wed Jun 25 12:49:52 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). @@ -3187,7 +3187,7 @@ This report was generated on **Wed Jun 25 12:42:57 WEST 2025** using [Gradle-Lic The dependencies distributed under several licenses, are used according their commercial-use-friendly license. -This report was generated on **Wed Jun 25 12:42:57 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). +This report was generated on **Wed Jun 25 12:49:52 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). @@ -4035,7 +4035,7 @@ This report was generated on **Wed Jun 25 12:42:57 WEST 2025** using [Gradle-Lic The dependencies distributed under several licenses, are used according their commercial-use-friendly license. -This report was generated on **Wed Jun 25 12:42:57 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). +This report was generated on **Wed Jun 25 12:49:52 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). @@ -4875,7 +4875,7 @@ This report was generated on **Wed Jun 25 12:42:57 WEST 2025** using [Gradle-Lic The dependencies distributed under several licenses, are used according their commercial-use-friendly license. -This report was generated on **Wed Jun 25 12:42:57 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). +This report was generated on **Wed Jun 25 12:49:53 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). @@ -5715,7 +5715,7 @@ This report was generated on **Wed Jun 25 12:42:57 WEST 2025** using [Gradle-Lic The dependencies distributed under several licenses, are used according their commercial-use-friendly license. -This report was generated on **Wed Jun 25 12:42:57 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). +This report was generated on **Wed Jun 25 12:49:53 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). @@ -6563,7 +6563,7 @@ This report was generated on **Wed Jun 25 12:42:57 WEST 2025** using [Gradle-Lic The dependencies distributed under several licenses, are used according their commercial-use-friendly license. -This report was generated on **Wed Jun 25 12:42:57 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). +This report was generated on **Wed Jun 25 12:49:53 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). @@ -7415,7 +7415,7 @@ This report was generated on **Wed Jun 25 12:42:57 WEST 2025** using [Gradle-Lic The dependencies distributed under several licenses, are used according their commercial-use-friendly license. -This report was generated on **Wed Jun 25 12:42:58 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). +This report was generated on **Wed Jun 25 12:49:53 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). @@ -8244,7 +8244,7 @@ This report was generated on **Wed Jun 25 12:42:58 WEST 2025** using [Gradle-Lic The dependencies distributed under several licenses, are used according their commercial-use-friendly license. -This report was generated on **Wed Jun 25 12:42:58 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). +This report was generated on **Wed Jun 25 12:49:53 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). @@ -8981,7 +8981,7 @@ This report was generated on **Wed Jun 25 12:42:58 WEST 2025** using [Gradle-Lic The dependencies distributed under several licenses, are used according their commercial-use-friendly license. -This report was generated on **Wed Jun 25 12:42:59 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). +This report was generated on **Wed Jun 25 12:49:54 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). @@ -9706,7 +9706,7 @@ This report was generated on **Wed Jun 25 12:42:59 WEST 2025** using [Gradle-Lic The dependencies distributed under several licenses, are used according their commercial-use-friendly license. -This report was generated on **Wed Jun 25 12:42:59 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). +This report was generated on **Wed Jun 25 12:49:54 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). @@ -10519,7 +10519,7 @@ This report was generated on **Wed Jun 25 12:42:59 WEST 2025** using [Gradle-Lic The dependencies distributed under several licenses, are used according their commercial-use-friendly license. -This report was generated on **Wed Jun 25 12:42:59 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). +This report was generated on **Wed Jun 25 12:49:54 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). @@ -11308,7 +11308,7 @@ This report was generated on **Wed Jun 25 12:42:59 WEST 2025** using [Gradle-Lic The dependencies distributed under several licenses, are used according their commercial-use-friendly license. -This report was generated on **Wed Jun 25 12:42:59 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). +This report was generated on **Wed Jun 25 12:49:54 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). @@ -12296,7 +12296,7 @@ This report was generated on **Wed Jun 25 12:42:59 WEST 2025** using [Gradle-Lic The dependencies distributed under several licenses, are used according their commercial-use-friendly license. -This report was generated on **Wed Jun 25 12:42:59 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). +This report was generated on **Wed Jun 25 12:49:54 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). @@ -13169,7 +13169,7 @@ This report was generated on **Wed Jun 25 12:42:59 WEST 2025** using [Gradle-Lic The dependencies distributed under several licenses, are used according their commercial-use-friendly license. -This report was generated on **Wed Jun 25 12:43:00 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). +This report was generated on **Wed Jun 25 12:49:55 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). @@ -13986,4 +13986,4 @@ This report was generated on **Wed Jun 25 12:43:00 WEST 2025** using [Gradle-Lic The dependencies distributed under several licenses, are used according their commercial-use-friendly license. -This report was generated on **Wed Jun 25 12:43:00 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 +This report was generated on **Wed Jun 25 12:49:55 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 d58ae1b5f..a1306fabe 100644 --- a/pom.xml +++ b/pom.xml @@ -1,30 +1,4 @@ - - 4.0.0 |Request task| B{Task Type?} + B -->|Documentation| C[ChatGPT] + B -->|Code Generation| D[Codex] + B -->|Architecture Analysis| E[GPT-4o] + C -->|Produce Documentation| F[Review & Merge] + D -->|Generate Code| F + E -->|Optimize & Refactor| F + F -->|Iterate if needed| A +``` + +*Note: The diagram shows the typical workflow and which agent to use for different task types.* + + +### Tagging pull request messages + +Use PR tags for clarity: +```text +feat(chatgpt): Updated README with clearer KDoc examples +fix(codex): Completed missing `when` branches in tests +perf(gpt-4o): Optimized event processing pipeline +``` +#### Why tag pull requests? +Tagging PRs helps the team: + - Track which agent contributed to specific changes. + - Understand whether a PR needs extra human review based on the agent's role. + - Make decisions about multi-agent collaboration in reviews. + +### Selecting the right Agent + +

+Click to expand the decision tree for agent selection + +``` +Is the task primarily documentation or explanation? +β”œβ”€β”€ Yes β†’ Use ChatGPT +└── No β†’ Continue + +Is the task primarily generating boilerplate code or tests? +β”œβ”€β”€ Yes β†’ Use Codex +└── No β†’ Continue + +Does the task involve complex architectural decisions or advanced Kotlin features? +β”œβ”€β”€ Yes β†’ Use GPT-4o +└── No β†’ Use ChatGPT for analysis, then Codex for implementation +``` + +**Task examples by Agent:** + +- **ChatGPT**: Documentation, conceptual explanations, architectural insights +- **Codex**: Code generation, test scaffolding, completing partially written code +- **GPT-4o**: Advanced architectural patterns, Kotlin idiom optimization, complex refactoring + +
+ +--- + +## 🧾 Coding guidelines for Agents + +### Core principles + +- Adhere to [Spine Event Engine Documentation][spine-docs] for coding style. +- Generate code that compiles cleanly and passes static analysis. +- Respect existing architecture, naming conventions, and project structure. +- Write clear, incremental commits with descriptive messages. +- Include automated tests for any code change that alters functionality. + +### Kotlin best practices + +#### βœ… Prefer +- **Kotlin idioms** over Java-style approaches: + - Extension functions + - `when` expressions + - Smart casts + - Data classes and sealed classes + - Immutable data structures +- **Simple nouns** over composite nouns (`user` > `userAccount`) +- **Generic parameters** over explicit variable types (`val list = mutableList()`) +- **Java interop annotations** only when needed (`@file:JvmName`, `@JvmStatic`) +- **Kotlin DSL** for Gradle files + +#### ❌ Avoid +- Mutable data structures +- Java-style verbosity (builders with setters) +- Redundant null checks (`?.let` misuse) +- Using `!!` unless clearly justified +- Type names in variable names (`userObject`, `itemList`) +- String duplication (use constants in companion objects) +- Mixing Groovy and Kotlin DSLs in build logic +- Reflection unless specifically requested + +### Documentation & comments + +#### KDoc style +- Write concise descriptions for all public and internal APIs. +- Start parameter descriptions with capital letters. +- End parameter descriptions with commas. +- Use inline code with backticks for code references (`example`). +- Format code blocks with fences and language identifiers: + ```kotlin + // Example code + fun example() { + // Implementation + } + ``` + +#### Commenting guidelines +- Avoid inline comments in production code unless necessary. +- Inline comments are helpful in tests. +- When using TODO comments, follow the format on [dedicated page][todo-comments]. +- File and directory names should be formatted as code. + +#### Tex width +- Wrap `.md` text to 80 characters for readability. +- Wrap KDoc comments at 75 characters. + +#### Using periods +- Use periods at the end of complete sentences. +- Use no periods for short bullets. +- Use periods for full or multi-clause bullets. +- Use no periods for fragments. +- Use no periods in titles and headers. +- Be consistent within the list! + +### Text formatting + - βœ… Remove double empty lines in the code. + - βœ… Remove trailing space characters in the code. + +--- + +## Safety rules + +- βœ… All code must compile and pass static analysis. +- βœ… Do not auto-update external dependencies. +- ❌ Never use reflection or unsafe code without explicit approval. +- ❌ No analytics or telemetry code. +- ❌ No blocking calls inside coroutines. + +--- + +## Version policy + +
+Click to expand versioning guidelines + +### We use semver +The version of the project is kept in the `version.gradle.kts` file in the root of the project. + +The version numbers in these files follow the conventions of +[Semantic Versioning 2.0.0](https://semver.org/). + +### Quick checklist for versioning +1. Increment the patch version in `version.gradle.kts`. + Retain zero-padding if applicable: + - Example: `"2.0.0-SNAPSHOT.009"` β†’ `"2.0.0-SNAPSHOT.010"` +2. Commit the version bump separately with this comment: + ```text + Bump version β†’ `$newVersion` + ``` +3. Rebuild using `./gradlew clean build`. +4. Update `pom.xml`, `dependencies.md` and commit changes with: `Update dependency reports` + +Remember: PRs without version bumps will fail CI (conflict resolution detailed above). + +### Resolving conflicts in `version.gradle.kts` +A branch conflict over the version number should be resolved as described below. + * If a merged branch has a number which is less than that of the current branch, the version of + the current branch stays. + * If the merged branch has the number which is greater or equal to that of the current branch, + the number should be increased by one. + +### When to bump the version? + - When a new branch is created. + +
+--- + +## Running builds + +
+Click to expand build instructions + +1. When modifying code, run: + ```bash + ./gradlew build + ``` + +2. If Protobuf (`.proto`) files are modified run: + ```bash + ./gradlew clean build + ```` + +3. Documentation-only changes run: + ```bash + ./gradlew dokka + ``` + Documentation-only changes do not require running tests! + +
+--- + +## πŸ“ Project structure expectations + +
+Click to expand project structure details + +```yaml +.github +buildSrc/ + + src/ + β”œβ”€β”€ main/ + β”‚ β”œβ”€β”€ kotlin/ # Kotlin source files + β”‚ └── java/ # Legacy Java code + β”œβ”€β”€ test/ + β”‚ └── kotlin/ # Unit and integration tests + build.gradle.kts # Kotlin-based build configuration + + +build.gradle.kts # Kotlin-based build configuration +settings.gradle.kts # Project structure and settings +README.md # Project overview +AGENTS.md # LLM agent instructions (this file) +version.gradle.kts # Declares the project version. +``` + +
+--- + +## πŸ“„ Documentation tasks + +
+Click to expand documentation guidelines + +- Suggest better **names** and **abstractions**. + +#### Documentation checklist +1. Ensure all public and internal APIs have KDoc examples. +2. Add in-line code blocks for clarity. +3. Use `TODO` comments with agent names for unresolved logic sections: + - Example: `// TODO(chatgpt): Refactor `EventStore` for better CQRS compliance.` + +
+ +--- + +## πŸ§ͺ Testing + +### Guidelines +- Do not use mocks, use stubs. +- Prefer [Kotest assertions][kotest-assertions] over + assertions from JUnit or Google Truth. + +### Responsibilities + +#### Codex +- Generate unit tests for APIs (handles edge cases/scenarios). +- Supply scaffolds for typical Kotlin patterns (`when`, sealed classes). + +#### ChatGPT +- Suggest test coverage improvements. +- Propose property-based testing or rare edge case scenarios. + +--- + +## 🚨 Safety rules for Agents + +- Do **not** auto-update external dependencies without explicit request. +- Do **not** inject analytics or telemetry code. +- Flag any usage of unsafe constructs (e.g., reflection, I/O on the main thread). +- Avoid generating blocking calls inside coroutines. + +--- + +## βš™οΈ Refactoring guidelines + +
+Click to expand refactoring guidelines + +- Do not replace Kotest assertions with standard Kotlin's Built-In Test Assertions. + +
+ +--- + +## πŸ’¬ Interaction tips – key to effective collaboration! + +
+Click to expand collaboration guidelines + +- Human programmers may use inline comments to guide agents: + ```kotlin + // ChatGPT: Suggest a refactor for better readability. + // Codex: Complete the missing branches in this `when` block. + // ChatGPT: explain this logic. + // Codex: complete this function. + ``` +- Agents should ensure pull request messages are concise and descriptive: + ```text + feat(chatgpt): suggested DSL refactoring for query handlers + fix(codex): completed missing case in sealed class hierarchy + ``` +- Encourage `// TODO:` or `// FIXME:` comments to be clarified by ChatGPT. + +- When agents or humans add TODO comments, they **must** follow the format described on + the [dedicated page][todo-comments]. + +
+ +--- + +## 🧭 LLM goals + +These goals guide how agents (ChatGPT, Codex) are used in this project to: +- Help developers move faster without sacrificing code quality. +- Provide language-aware guidance on Kotlin/Java idioms. +- Lower the barrier to onboarding new contributors. +- Enable collaborative, explainable, and auditable development with AI. + +### Problem-solving framework for complex tasks + +When faced with complex tasks, follow this framework: + +1. **Decompose**: Break down the problem into smaller, manageable parts +2. **Analyze**: Understand the architectural implications of each part +3. **Pattern-Match**: Identify established patterns that apply +4. **Implement**: Write code that follows project conventions +5. **Test**: Ensure comprehensive test coverage +6. **Document**: Provide clear explanations of your solution + +*This framework helps maintain consistency across contributions from different agents.* + +### πŸš€ GPT-4o advanced capabilities + +GPT-4o excels at these high-value tasks in our CQRS architecture: + +1. **Architecture-level insights** + - Suggesting architectural improvements in CQRS pattern implementation + - Identifying cross-cutting concerns between command and query sides + - Optimizing event flow and state propagation + +2. **Advanced Kotlin refactoring** + - Converting imperative code to idiomatic Kotlin (sequences, extensions, etc.) + - Applying context receivers and other Kotlin 1.6+ features + - Optimizing coroutine patterns and structured concurrency + +3. **Testing intelligence** + - Identifying missing property-based test scenarios + - Suggesting event sequence combinations that could cause race conditions + - Creating comprehensive test fixtures for complex domain objects + +#### Example prompts for GPT-4o + +Leverage GPT-4o's advanced capabilities with prompts like these: + +```text +# Architecture analysis +"Analyze this CommandHandler implementation and suggest improvements to better align with CQRS principles, especially considering event sourcing implications." + +# Kotlin refactoring +"Refactor this Java-style code to use more idiomatic Kotlin patterns. Pay special attention to immutability, extension functions, and DSL opportunities." + +# Test enhancement +"Review this test suite for our event processing pipeline and suggest additional test scenarios focusing on concurrent event handling edge cases." +``` + +--- + +## πŸ“‹ Common tasks + +
+Click to expand common task instructions + +- **Adding a new dependency**: Update relevant files in `buildSrc` directory. +- **Creating a new module**: Follow existing module structure patterns. +- **Documentation**: Use KDoc style for public and internal APIs. +- **Testing**: Create comprehensive tests using Kotest assertions. + +
+ +--- + +## πŸ‘‹ Welcome, Agents! + - You are here to help. + - Stay consistent, stay clear, and help this Kotlin/Java codebase become more robust, + elegant, and maintainable. + + +[spine-docs]: https://github.com/SpineEventEngine/documentation/wiki +[kotest-assertions]: https://kotest.io/docs/assertions/assertions.html +[todo-comments]: https://github.com/SpineEventEngine/documentation/wiki/TODO-comments diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts index c333f29b1..b41bfb40f 100644 --- a/buildSrc/build.gradle.kts +++ b/buildSrc/build.gradle.kts @@ -169,7 +169,6 @@ dependencies { "com.github.jk1:gradle-license-report:$licenseReportVersion", "com.google.guava:guava:$guavaVersion", "com.google.protobuf:protobuf-gradle-plugin:$protobufPluginVersion", - "com.google.protobuf:protobuf-gradle-plugin:$protobufPluginVersion", "com.gradleup.shadow:shadow-gradle-plugin:$shadowVersion", "io.gitlab.arturbosch.detekt:detekt-gradle-plugin:$detektVersion", "io.kotest:kotest-gradle-plugin:$kotestJvmPluginVersion", diff --git a/buildSrc/src/main/kotlin/DokkaExts.kt b/buildSrc/src/main/kotlin/DokkaExts.kt index 4f6d634cc..03a6e0392 100644 --- a/buildSrc/src/main/kotlin/DokkaExts.kt +++ b/buildSrc/src/main/kotlin/DokkaExts.kt @@ -28,7 +28,6 @@ import io.spine.dependency.build.Dokka import io.spine.gradle.publish.getOrCreate import java.io.File import java.time.LocalDate -import org.gradle.api.NamedDomainObjectProvider import org.gradle.api.Project import org.gradle.api.artifacts.Dependency import org.gradle.api.artifacts.dsl.DependencyHandler diff --git a/buildSrc/src/main/kotlin/jvm-module.gradle.kts b/buildSrc/src/main/kotlin/jvm-module.gradle.kts index 30c80c2ff..b3d6ef0dd 100644 --- a/buildSrc/src/main/kotlin/jvm-module.gradle.kts +++ b/buildSrc/src/main/kotlin/jvm-module.gradle.kts @@ -30,7 +30,6 @@ 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.Kotlin import io.spine.dependency.lib.Protobuf import io.spine.dependency.local.Reflect import io.spine.dependency.test.Jacoco diff --git a/buildSrc/src/main/kotlin/kmp-publish.gradle.kts b/buildSrc/src/main/kotlin/kmp-publish.gradle.kts index 8fb391dc0..53b0a219f 100644 --- a/buildSrc/src/main/kotlin/kmp-publish.gradle.kts +++ b/buildSrc/src/main/kotlin/kmp-publish.gradle.kts @@ -1,5 +1,5 @@ /* - * 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. @@ -64,7 +64,7 @@ plugins { publishing.publications { named("kotlinMultiplatform") { - // Although, the β€œcommon artifact” can't be used independently + // Although, the "common artifact" can't be used independently // of target artifacts, it is published with documentation. artifact(project.dokkaKotlinJar()) } diff --git a/config b/config index fab231bb9..e60974948 160000 --- a/config +++ b/config @@ -1 +1 @@ -Subproject commit fab231bb932cf3ea2d51b89373f06dcb1e06cbc5 +Subproject commit e60974948530988efae6f63237b47e19dba80773 diff --git a/gradle.properties b/gradle.properties index 68021b634..b74edb9b6 100644 --- a/gradle.properties +++ b/gradle.properties @@ -31,9 +31,10 @@ org.gradle.java.installations.auto-detect=true org.gradle.java.installations.auto-download=true # Use parallel builds for better performance. -#org.gradle.parallel=true +org.gradle.parallel=true #org.gradle.caching=true +# Dokka plugin eats more memory than usual. Therefore, all builds should have enough. org.gradle.jvmargs=-Xmx4096m -XX:MaxMetaspaceSize=1024m -XX:+UseParallelGC # suppress inspection "UnusedProperty" From 9c84902a19133289acc765231e78428c437ec1ec Mon Sep 17 00:00:00 2001 From: alexander-yevsyukov Date: Wed, 25 Jun 2025 16:37:01 +0100 Subject: [PATCH 14/24] Fix description of the `package-info` --- logging/src/jvmTest/java/io/spine/logging/package-info.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/logging/src/jvmTest/java/io/spine/logging/package-info.java b/logging/src/jvmTest/java/io/spine/logging/package-info.java index 399aca0de..9f00bb38a 100644 --- a/logging/src/jvmTest/java/io/spine/logging/package-info.java +++ b/logging/src/jvmTest/java/io/spine/logging/package-info.java @@ -25,7 +25,11 @@ */ /** - * This package provides a JVM implementation of Spine Logging API. + * This package tests the JVM implementation of Spine Logging API. + * + *

The purpose of this file is to avoid static analysis warnings + * when tools do not see the {@code package-info.java} file + * available from the {@code commonMain} source set. */ @CheckReturnValue @NullMarked From b902c97a2aa6b9a4815be3d24b2dd81df57bb037 Mon Sep 17 00:00:00 2001 From: alexander-yevsyukov Date: Wed, 25 Jun 2025 16:37:12 +0100 Subject: [PATCH 15/24] Restore (c) lines --- .../src/main/java/io/spine/logging/flogger/AbstractLogger.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flogger/middleware/src/main/java/io/spine/logging/flogger/AbstractLogger.java b/flogger/middleware/src/main/java/io/spine/logging/flogger/AbstractLogger.java index aedfced67..4d8f0babd 100644 --- a/flogger/middleware/src/main/java/io/spine/logging/flogger/AbstractLogger.java +++ b/flogger/middleware/src/main/java/io/spine/logging/flogger/AbstractLogger.java @@ -1,5 +1,5 @@ /* - * Copyright 2019, The Flogger Authors; 2025, 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. From a4f7fea51c70a6b8874e4c83e10153576f82c5db Mon Sep 17 00:00:00 2001 From: alexander-yevsyukov Date: Wed, 25 Jun 2025 16:38:01 +0100 Subject: [PATCH 16/24] Simplify method return --- .../main/java/io/spine/logging/flogger/backend/Platform.java | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/flogger/middleware/src/main/java/io/spine/logging/flogger/backend/Platform.java b/flogger/middleware/src/main/java/io/spine/logging/flogger/backend/Platform.java index 15edf68be..34f67bce9 100644 --- a/flogger/middleware/src/main/java/io/spine/logging/flogger/backend/Platform.java +++ b/flogger/middleware/src/main/java/io/spine/logging/flogger/backend/Platform.java @@ -1,5 +1,5 @@ /* - * Copyright 2019, The Flogger Authors; 2025, 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. @@ -270,9 +270,6 @@ public static boolean shouldForceLogging(String loggerName, Level level, boolean checkNotNull(loggerName); var provider = getContextDataProvider(); var result = provider.getMappedLevel(loggerName); - if (result == null) { - return null; - } return result; } From 384f5eb4ed5484bb6a580abd9ff40a0ec5299559 Mon Sep 17 00:00:00 2001 From: Alexander Yevsyukov Date: Wed, 25 Jun 2025 18:55:41 +0300 Subject: [PATCH 17/24] Fix (c) statement --- .../io/spine/logging/context/grpc/GrpcContextDataProvider.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contexts/grpc-context/src/main/java/io/spine/logging/context/grpc/GrpcContextDataProvider.java b/contexts/grpc-context/src/main/java/io/spine/logging/context/grpc/GrpcContextDataProvider.java index 242db3778..5ed78613b 100644 --- a/contexts/grpc-context/src/main/java/io/spine/logging/context/grpc/GrpcContextDataProvider.java +++ b/contexts/grpc-context/src/main/java/io/spine/logging/context/grpc/GrpcContextDataProvider.java @@ -1,5 +1,5 @@ /* - * Copyright 2025, TeamDev. All rights reserved. + * Copyright 2019, The Flogger Authors; 2023, 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. From 5f4e911e267cacb3254c5335a2ab9688c6d19505 Mon Sep 17 00:00:00 2001 From: Alexander Yevsyukov Date: Wed, 25 Jun 2025 18:56:29 +0300 Subject: [PATCH 18/24] Fix (c) statement --- .../src/main/java/io/spine/logging/flogger/AbstractLogger.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flogger/middleware/src/main/java/io/spine/logging/flogger/AbstractLogger.java b/flogger/middleware/src/main/java/io/spine/logging/flogger/AbstractLogger.java index 4d8f0babd..ab24ddf55 100644 --- a/flogger/middleware/src/main/java/io/spine/logging/flogger/AbstractLogger.java +++ b/flogger/middleware/src/main/java/io/spine/logging/flogger/AbstractLogger.java @@ -1,5 +1,5 @@ /* - * Copyright 2025, TeamDev. All rights reserved. + * Copyright 2012, The Flogger Authors; 2023, 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. From 23e704b8c17da1ef098137cd0a5dc29447a6b53a Mon Sep 17 00:00:00 2001 From: alexander-yevsyukov Date: Wed, 25 Jun 2025 17:00:47 +0100 Subject: [PATCH 19/24] Fix (c) statements --- .../io/spine/logging/context/grpc/GrpcContextDataProvider.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contexts/grpc-context/src/main/java/io/spine/logging/context/grpc/GrpcContextDataProvider.java b/contexts/grpc-context/src/main/java/io/spine/logging/context/grpc/GrpcContextDataProvider.java index 5ed78613b..242db3778 100644 --- a/contexts/grpc-context/src/main/java/io/spine/logging/context/grpc/GrpcContextDataProvider.java +++ b/contexts/grpc-context/src/main/java/io/spine/logging/context/grpc/GrpcContextDataProvider.java @@ -1,5 +1,5 @@ /* - * Copyright 2019, The Flogger Authors; 2023, 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. From b4b2019466a91fb652c98de4aea90ee18f223c0d Mon Sep 17 00:00:00 2001 From: alexander-yevsyukov Date: Wed, 25 Jun 2025 17:00:55 +0100 Subject: [PATCH 20/24] Fix (c) year --- .../main/java/io/spine/logging/context/grpc/package-info.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/contexts/grpc-context/src/main/java/io/spine/logging/context/grpc/package-info.java b/contexts/grpc-context/src/main/java/io/spine/logging/context/grpc/package-info.java index 40aad02f8..4a43ae91e 100644 --- a/contexts/grpc-context/src/main/java/io/spine/logging/context/grpc/package-info.java +++ b/contexts/grpc-context/src/main/java/io/spine/logging/context/grpc/package-info.java @@ -1,11 +1,11 @@ /* - * Copyright 2023, The Flogger Authors; 2023, 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 From 5ecdf74eb172268475fc6686b0421687c5e195e6 Mon Sep 17 00:00:00 2001 From: alexander-yevsyukov Date: Wed, 25 Jun 2025 17:02:04 +0100 Subject: [PATCH 21/24] Update config --- AGENTS.md | 4 ++-- config | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/AGENTS.md b/AGENTS.md index de4b5456a..6855cfae1 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -37,7 +37,7 @@ > collaborate on our Kotlin/Java project. It defines responsibilities, coding standards, > and workflows to maintain high code quality and architectural integrity. -This document explains how to use **ChatGPT** and **Codex** effectively in this Kotlin/Java project. +This document explains how to use **ChatGPT** and **Codex** in this Kotlin/Java project. It outlines: @@ -45,7 +45,7 @@ It outlines: - Coding and architectural guidelines agents must follow. - Instructions for creating and testing agent-generated outputs. -Whether you are a developer, tester, or contributor, this guide will help you collaborate +Whether you are a developer, tester, or contributor, this guide helps you collaborate with AI to maintain a high-quality codebase. ### Terminology diff --git a/config b/config index e60974948..36a2aa28d 160000 --- a/config +++ b/config @@ -1 +1 @@ -Subproject commit e60974948530988efae6f63237b47e19dba80773 +Subproject commit 36a2aa28dd5a25efd029668e4357df05e6024ac9 From ad14759f9e954d33fb852b0297e9f36ce78c0d64 Mon Sep 17 00:00:00 2001 From: alexander-yevsyukov Date: Wed, 25 Jun 2025 17:05:04 +0100 Subject: [PATCH 22/24] Restore (c) statement --- .../java/io/spine/logging/context/grpc/GrpcContextData.java | 2 +- .../io/spine/logging/context/grpc/GrpcContextDataProvider.java | 2 +- .../io/spine/logging/context/grpc/GrpcScopedLoggingContext.java | 2 +- .../main/java/io/spine/logging/context/grpc/package-info.java | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/contexts/grpc-context/src/main/java/io/spine/logging/context/grpc/GrpcContextData.java b/contexts/grpc-context/src/main/java/io/spine/logging/context/grpc/GrpcContextData.java index b476db326..dd090f4f8 100644 --- a/contexts/grpc-context/src/main/java/io/spine/logging/context/grpc/GrpcContextData.java +++ b/contexts/grpc-context/src/main/java/io/spine/logging/context/grpc/GrpcContextData.java @@ -1,5 +1,5 @@ /* - * Copyright 2025, TeamDev. All rights reserved. + * Copyright 2019, The Flogger Authors; 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. diff --git a/contexts/grpc-context/src/main/java/io/spine/logging/context/grpc/GrpcContextDataProvider.java b/contexts/grpc-context/src/main/java/io/spine/logging/context/grpc/GrpcContextDataProvider.java index 242db3778..d4c2a1dad 100644 --- a/contexts/grpc-context/src/main/java/io/spine/logging/context/grpc/GrpcContextDataProvider.java +++ b/contexts/grpc-context/src/main/java/io/spine/logging/context/grpc/GrpcContextDataProvider.java @@ -1,5 +1,5 @@ /* - * Copyright 2025, TeamDev. All rights reserved. + * Copyright 2019, The Flogger Authors; 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. diff --git a/contexts/grpc-context/src/main/java/io/spine/logging/context/grpc/GrpcScopedLoggingContext.java b/contexts/grpc-context/src/main/java/io/spine/logging/context/grpc/GrpcScopedLoggingContext.java index 5fc00bc81..590c8e0c8 100644 --- a/contexts/grpc-context/src/main/java/io/spine/logging/context/grpc/GrpcScopedLoggingContext.java +++ b/contexts/grpc-context/src/main/java/io/spine/logging/context/grpc/GrpcScopedLoggingContext.java @@ -1,5 +1,5 @@ /* - * Copyright 2025, TeamDev. All rights reserved. + * Copyright 2019, The Flogger Authors; 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. diff --git a/contexts/grpc-context/src/main/java/io/spine/logging/context/grpc/package-info.java b/contexts/grpc-context/src/main/java/io/spine/logging/context/grpc/package-info.java index 4a43ae91e..14b670068 100644 --- a/contexts/grpc-context/src/main/java/io/spine/logging/context/grpc/package-info.java +++ b/contexts/grpc-context/src/main/java/io/spine/logging/context/grpc/package-info.java @@ -1,5 +1,5 @@ /* - * Copyright 2025, TeamDev. All rights reserved. + * Copyright 2023, The Flogger Authors; 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. From 765c43fe96345f356bebbdb8eb2d25ab16ebab70 Mon Sep 17 00:00:00 2001 From: alexander-yevsyukov Date: Wed, 25 Jun 2025 17:05:33 +0100 Subject: [PATCH 23/24] Restore (c) statement --- .../main/java/io/spine/logging/flogger/backend/Platform.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flogger/middleware/src/main/java/io/spine/logging/flogger/backend/Platform.java b/flogger/middleware/src/main/java/io/spine/logging/flogger/backend/Platform.java index 34f67bce9..1af703305 100644 --- a/flogger/middleware/src/main/java/io/spine/logging/flogger/backend/Platform.java +++ b/flogger/middleware/src/main/java/io/spine/logging/flogger/backend/Platform.java @@ -1,5 +1,5 @@ /* - * Copyright 2025, TeamDev. All rights reserved. + * Copyright 2019, The Flogger Authors; 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. From fe31f99f051a500516fa3acf395b22728cafaf20 Mon Sep 17 00:00:00 2001 From: alexander-yevsyukov Date: Wed, 25 Jun 2025 17:06:44 +0100 Subject: [PATCH 24/24] Restore (c) statement --- .../src/main/java/io/spine/logging/flogger/AbstractLogger.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flogger/middleware/src/main/java/io/spine/logging/flogger/AbstractLogger.java b/flogger/middleware/src/main/java/io/spine/logging/flogger/AbstractLogger.java index ab24ddf55..aedfced67 100644 --- a/flogger/middleware/src/main/java/io/spine/logging/flogger/AbstractLogger.java +++ b/flogger/middleware/src/main/java/io/spine/logging/flogger/AbstractLogger.java @@ -1,5 +1,5 @@ /* - * Copyright 2012, The Flogger Authors; 2023, TeamDev. All rights reserved. + * Copyright 2019, The Flogger Authors; 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.