diff --git a/.agents/guidelines/project-owned-files.md b/.agents/guidelines/project-owned-files.md index 301553f..25d9c71 100644 --- a/.agents/guidelines/project-owned-files.md +++ b/.agents/guidelines/project-owned-files.md @@ -1,5 +1,17 @@ # Project-owned files +## Rule for this repository + +This repository has no `.gitmodules`, so it has no submodule contents or +`config`-distributed files to exclude. Treat every tracked path as project-owned, +including `buildSrc/`, `AGENTS.md`, `CLAUDE.md`, `gradle.properties`, and +`.github/copilot-instructions.md`. Its `config/` directory contains project-owned +Detekt configuration. + +Do not apply the reusable skip rules below in this repository. + +## Why ownership matters + Some skills edit or stamp files across a whole repository. For example, `proofread` rewrites prose. These skills must touch only the files the repository **owns**. Editing an upstream file is worse than a no-op: the @@ -10,14 +22,12 @@ This page defines *project-owned* and the two kinds of upstream-owned paths to skip. Each consuming skill applies the rule to its file types; this page defines the shared mechanism, while the file filter remains in the consuming skill. -Determine submodule ownership from `.gitmodules`, never from a directory name. -This repository currently has no `.gitmodules`. Its `config/` directory contains -project-owned Detekt configuration, so neither skip rule applies here. - -## What to skip +## Reusable rules for repositories with submodules -A repository does **not** own two kinds of tracked files. Skip both in every -mode: full sweeps, scoped sweeps, and incremental branch-diff runs alike. +Apply these rules only when `.gitmodules` declares the relevant submodule. +Determine submodule ownership from `.gitmodules`, never from a directory name. +A repository does **not** own the two kinds of tracked files below. Skip them +in every mode: full sweeps, scoped sweeps, and incremental branch-diff runs alike. ### 1. Submodule contents diff --git a/.agents/skills/proofread/SKILL.md b/.agents/skills/proofread/SKILL.md index 4ff62c4..d6f16e6 100644 --- a/.agents/skills/proofread/SKILL.md +++ b/.agents/skills/proofread/SKILL.md @@ -67,16 +67,15 @@ wrong fix.** When a fix is not clearly correct, leave the text and report it. untracked, non-ignored files (new prose not yet `git add`ed) alongside tracked changes. Keep them, then intersect the whole list with the file-type filter. - **Then drop everything the project does not own**, per - `.agents/guidelines/project-owned-files.md` — submodule contents and, in - a repo that consumes `config`, the config-distributed files. This skill - processes prose, so of the config-distributed set it encounters the - Markdown members (`AGENTS.md`, `CLAUDE.md`, `CODE_OF_CONDUCT.md`, - `.junie/guidelines.md`, `.github/copilot-instructions.md`, and the - conditional `CONTRIBUTING.md`) and the source members under `buildSrc/` - (except `buildSrc/src/main/kotlin/module.gradle.kts`). Apply the skip in - every mode; in the `config` and `agents` source repos the config rule is - inert (those files are project-owned there). + **Apply the repository-specific ownership conclusion.** This repository has + no `.gitmodules`, so it has no project-ownership exclusions. Keep every + candidate that survives the file filter, including Markdown files at the + repository root and eligible source files under `buildSrc/`. + + If this skill is reused in another repository, follow + `.agents/guidelines/project-owned-files.md`. Drop submodule contents only + when `.gitmodules` declares them, and drop `config`-distributed files only + when `.gitmodules` declares the `config` submodule. 3. **Scan and fix each file.** Restrict edits to **prose only**, per the “Where English prose lives” and “Never edit” sections of diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml index 84956a2..a844bfe 100644 --- a/.github/workflows/check.yml +++ b/.github/workflows/check.yml @@ -68,7 +68,7 @@ jobs: run: >- ./gradlew -Dorg.gradle.java.installations.paths="$EMBED_CODE_JAVA_17_HOME" - build :buildSrc:test :gradle-plugin:publishToMavenLocal + build :buildSrc:check :gradle-plugin:publishToMavenLocal - name: Verify Dependency Reports if: runner.os == 'Linux' diff --git a/PROJECT.md b/PROJECT.md index 6c2c9c9..46592ac 100644 --- a/PROJECT.md +++ b/PROJECT.md @@ -24,11 +24,12 @@ Embed Code configuration file and do not need to install the executable or Kotli - `version.gradle.kts`: the plugin version and default Embed Code application version. - `gradle.properties`: Gradle runtime, parallelism, build-cache, and configuration-cache settings, plus Kotlin style and dependency defaults. -- `buildSrc/`: build settings, dependency coordinates, and the shared `jvm-module` - convention. Its focused unit tests cover custom report logic; Detekt analyzes the plugin module - through the convention but does not analyze the standalone `buildSrc` build. +- `buildSrc/`: build settings, dependency coordinates, and the shared `jvm-module` and Dokka + conventions. Its focused unit tests cover custom report logic, and its own Detekt configuration + analyzes the build logic. - `gradle-plugin/build.gradle.kts`: plugin declaration, generated version source, functional - test source set, publication metadata, and Plugin Portal configuration. + test source set, Dokka API documentation, publication metadata, and Plugin Portal + configuration. - `gradle-plugin/src/main/kotlin/`: extension, plugin, task, platform, version, JSON, checksum, download, installation, and execution logic. - `gradle-plugin/src/main/templates/`: generated default-version source template. @@ -65,9 +66,10 @@ configuration → executable flow instead of patching only the first visible sym - `gradle-plugin/build.gradle.kts` uses the Kotlin runtime supplied by Gradle; it does not publish `kotlin-stdlib`. - Settings plugin versions are pinned in the root `settings.gradle.kts`; - `buildSrc/settings.gradle.kts` reuses that plugin classpath. Bootstrap plugin versions live - in `buildSrc/build.gradle.kts`, while reusable library coordinates live in Kotlin objects - under `buildSrc`. Do not introduce a version catalog as an unrelated refactor. + `buildSrc/settings.gradle.kts` reuses that plugin classpath. Bootstrap and convention-plugin + dependency versions live in `buildSrc/build.gradle.kts`, while reusable library coordinates + live in Kotlin objects under `buildSrc`. Do not introduce a version catalog as an unrelated + refactor. - The Foojay resolver may contact `api.foojay.io` and let Gradle download a missing JDK toolchain for contributor builds. CI provisions its required JDKs before invoking Gradle. This build-time provisioning is outside the plugin's SHA-256 verification of Embed Code @@ -85,8 +87,8 @@ version numbers into agent guidance where a durable source path is sufficient. - Keep tests offline with deterministic fixtures, temporary directories, and loopback HTTP servers. - Use `./gradlew test` for unit tests, `./gradlew functionalTest` for TestKit tests, and `./gradlew check` for both plus plugin validation. -- Use `./gradlew :buildSrc:test` for the build-logic tests. `buildSrc` is a separate build, - so `check` does not reach them; CI runs the task explicitly. +- Use `./gradlew :buildSrc:check` for the build-logic tests and Detekt analysis. `buildSrc` is a + separate build, so the root `check` task does not reach them; CI runs the task explicitly. - Use `./gradlew generateDependencyReports` after changing dependencies or the plugin version. CI verifies that the aggregate dependency POM and module license inventory match `pom.xml` and `dependencies.md`. diff --git a/README.md b/README.md index 1350364..ca008df 100644 --- a/README.md +++ b/README.md @@ -33,7 +33,7 @@ Add the following configuration to the project's `build.gradle.kts`: ```kotlin plugins { - id("io.spine.embed-code") version "0.1.0" // Specify the actual version here. + id("io.spine.embed-code") version "0.1.1" // Specify the actual version here. } embedCode { diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts index 49a9d09..c4432a4 100644 --- a/buildSrc/build.gradle.kts +++ b/buildSrc/build.gradle.kts @@ -24,10 +24,15 @@ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +import dev.detekt.gradle.Detekt as DetektTask +import dev.detekt.gradle.extensions.DetektExtension import org.jetbrains.kotlin.gradle.dsl.JvmTarget plugins { `kotlin-dsl` + // Detekt 1.23.8 does not support JDK 25. Keep this version in sync with + // `detektVersion` below. + id("dev.detekt") version "2.0.0-alpha.5" } // These bootstrap versions are declared here because `buildSrc` needs them @@ -35,10 +40,11 @@ plugins { val kotlinVersion = "2.4.10" val pluginPublishVersion = "2.1.1" val licenseReportVersion = "3.1.4" +val dokkaVersion = "2.2.0" // Keep in sync with `io.spine.embedcode.gradle.dependency.JUnit.version`, which supplies // the same version to the project's own modules. val junitVersion = "6.1.2" -// The alpha version is used because the latest stable version does not support JDK 25. +// Keep in sync with the `dev.detekt` plugin version above. val detektVersion = "2.0.0-alpha.5" dependencies { @@ -51,6 +57,7 @@ dependencies { implementation( "dev.detekt:dev.detekt.gradle.plugin:$detektVersion", ) + implementation("org.jetbrains.dokka:dokka-gradle-plugin:$dokkaVersion") testImplementation(platform("org.junit:junit-bom:$junitVersion")) testImplementation("org.junit.jupiter:junit-jupiter") testRuntimeOnly("org.junit.platform:junit-platform-launcher") @@ -71,6 +78,21 @@ java { targetCompatibility = JavaVersion.VERSION_17 } +extensions.configure { + config.setFrom(layout.projectDirectory.file("../config/detekt/detekt.yml")) + buildUponDefaultConfig.set(true) + source.setFrom( + files( + "src/main/kotlin", + "src/test/kotlin", + ), + ) +} + +tasks.withType().configureEach { + jvmTarget.set(JavaVersion.VERSION_17.majorVersion) +} + tasks.test { useJUnitPlatform() } diff --git a/buildSrc/src/main/kotlin/dokka-configuration.gradle.kts b/buildSrc/src/main/kotlin/dokka-configuration.gradle.kts new file mode 100644 index 0000000..b902017 --- /dev/null +++ b/buildSrc/src/main/kotlin/dokka-configuration.gradle.kts @@ -0,0 +1,35 @@ +/* + * Copyright 2026, TeamDev. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Redistribution and use in source and/or binary forms, with or without + * modification, must retain the above copyright notice and the following + * disclaimer. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +plugins { + id("org.jetbrains.dokka") +} + +dokka { + dokkaPublications.html { + moduleName.set(project.name) + } +} diff --git a/buildSrc/src/main/kotlin/io/spine/embedcode/gradle/report/DependencyPomRenderer.kt b/buildSrc/src/main/kotlin/io/spine/embedcode/gradle/report/DependencyPomRenderer.kt new file mode 100644 index 0000000..7f8c435 --- /dev/null +++ b/buildSrc/src/main/kotlin/io/spine/embedcode/gradle/report/DependencyPomRenderer.kt @@ -0,0 +1,130 @@ +/* + * Copyright 2026, TeamDev. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Redistribution and use in source and/or binary forms, with or without + * modification, must retain the above copyright notice and the following + * disclaimer. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package io.spine.embedcode.gradle.report + +/** Coordinates that identify the project described by the aggregate POM. */ +internal data class PomCoordinates( + val group: String, + val artifact: String, + val version: String, +) + +/** A first-level external dependency and its representative Maven scope. */ +internal data class PomDependency( + val group: String, + val artifact: String, + val version: String, + val scope: MavenScope, +) + +/** Maven scope used to group dependencies in the generated report. */ +internal enum class MavenScope( + val xmlValue: String, + val outputOrder: Int, + val selectionOrder: Int, +) { + COMPILE("compile", 0, 0), + RUNTIME("runtime", 1, 1), + TEST("test", 2, 3), + PROVIDED("provided", 3, 2), +} + +internal fun mavenScope(configurationName: String): MavenScope = + when (configurationName) { + "implementation", + "api", + -> + MavenScope.COMPILE + "runtimeOnly", + "runtimeClasspath", + "default", + -> + MavenScope.RUNTIME + "compileOnly", + "compileOnlyApi", + "annotationProcessor", + -> + MavenScope.PROVIDED + else -> { + if ( + configurationName.startsWith("test", ignoreCase = true) || + configurationName.startsWith("functionalTest", ignoreCase = true) + ) { + MavenScope.TEST + } else { + MavenScope.PROVIDED + } + } + } + +internal fun renderDependencyPom( + coordinates: PomCoordinates, + dependencies: List, +): String = + buildString { + appendLine("""""") + appendLine("""""", + ) + appendLine(" 4.0.0") + appendLine(" ") + appendLine(" ${coordinates.group.escapeXml()}") + appendLine(" ${coordinates.artifact.escapeXml()}") + appendLine(" ${coordinates.version.escapeXml()}") + appendLine(" ") + appendLine(" ") + appendLine(" The Apache License, Version 2.0") + appendLine(" https://www.apache.org/licenses/LICENSE-2.0.txt") + appendLine(" repo") + appendLine(" ") + appendLine(" ") + appendLine(" ") + dependencies.forEach { dependency -> + appendLine(" ") + appendLine(" ${dependency.group.escapeXml()}") + appendLine(" ${dependency.artifact.escapeXml()}") + appendLine(" ${dependency.version.escapeXml()}") + appendLine(" ${dependency.scope.xmlValue}") + appendLine(" ") + } + appendLine(" ") + appendLine("") + } + +private fun String.escapeXml(): String = + replace("&", "&") + .replace("<", "<") + .replace(">", ">") + .replace("\"", """) + .replace("'", "'") diff --git a/buildSrc/src/main/kotlin/io/spine/embedcode/gradle/report/GenerateDependencyPom.kt b/buildSrc/src/main/kotlin/io/spine/embedcode/gradle/report/GenerateDependencyPom.kt index 89241c8..021bc48 100644 --- a/buildSrc/src/main/kotlin/io/spine/embedcode/gradle/report/GenerateDependencyPom.kt +++ b/buildSrc/src/main/kotlin/io/spine/embedcode/gradle/report/GenerateDependencyPom.kt @@ -145,33 +145,6 @@ public abstract class GenerateDependencyPom : DefaultTask() { } } -/** Coordinates that identify the project described by the aggregate POM. */ -internal data class PomCoordinates( - val group: String, - val artifact: String, - val version: String, -) - -/** A first-level external dependency and its representative Maven scope. */ -internal data class PomDependency( - val group: String, - val artifact: String, - val version: String, - val scope: MavenScope, -) - -/** Maven scope used to group dependencies in the generated report. */ -internal enum class MavenScope( - val xmlValue: String, - val outputOrder: Int, - val selectionOrder: Int, -) { - COMPILE("compile", 0, 0), - RUNTIME("runtime", 1, 1), - TEST("test", 2, 3), - PROVIDED("provided", 3, 2), -} - /** A dependency declaration and the Gradle configuration that owns it. */ private data class DeclaredDependency( val group: String, @@ -196,14 +169,6 @@ private data class ResolvedVersion( get() = ModuleId(group, artifact) } -internal fun collectDependencies( - configurations: ConfigurationContainer, -): List { - val resolvedVersions = resolveDirectVersions(configurations) - val declarations = collectDeclarations(configurations) - return selectDependencies(declarations, resolvedVersions) -} - private fun collectDeclarations( configurations: ConfigurationContainer, ): List = @@ -225,22 +190,6 @@ private fun collectDeclarations( } } -private fun resolveDirectVersions( - configurations: ConfigurationContainer, -): Map> { - val versions = - configurations - .filter { it.isCanBeResolved } - .flatMap { configuration -> - directResolvedVersions( - configuration.incoming.resolutionResult.rootComponent.get(), - ) - } - return versions - .distinct() - .groupBy(ResolvedVersion::moduleId, ResolvedVersion::version) -} - private fun directResolvedVersions( root: ResolvedComponentResult, ): List = @@ -297,85 +246,9 @@ private fun selectDependencies( .thenBy { dependency -> dependency.artifact } ) -internal fun mavenScope(configurationName: String): MavenScope = - when (configurationName) { - "implementation", - "api", - -> - MavenScope.COMPILE - "runtimeOnly", - "runtimeClasspath", - "default", - -> - MavenScope.RUNTIME - "compileOnly", - "compileOnlyApi", - "annotationProcessor", - -> - MavenScope.PROVIDED - else -> { - if ( - configurationName.startsWith("test", ignoreCase = true) || - configurationName.startsWith("functionalTest", ignoreCase = true) - ) { - MavenScope.TEST - } else { - MavenScope.PROVIDED - } - } - } - -internal fun renderDependencyPom( - coordinates: PomCoordinates, - dependencies: List, -): String = - buildString { - appendLine("""""") - appendLine("""""", - ) - appendLine(" 4.0.0") - appendLine(" ") - appendLine(" ${coordinates.group.escapeXml()}") - appendLine(" ${coordinates.artifact.escapeXml()}") - appendLine(" ${coordinates.version.escapeXml()}") - appendLine(" ") - appendLine(" ") - appendLine(" The Apache License, Version 2.0") - appendLine(" https://www.apache.org/licenses/LICENSE-2.0.txt") - appendLine(" repo") - appendLine(" ") - appendLine(" ") - appendLine(" ") - dependencies.forEach { dependency -> - appendLine(" ") - appendLine(" ${dependency.group.escapeXml()}") - appendLine(" ${dependency.artifact.escapeXml()}") - appendLine(" ${dependency.version.escapeXml()}") - appendLine(" ${dependency.scope.xmlValue}") - appendLine(" ") - } - appendLine(" ") - appendLine("") - } - -private fun String.escapeXml(): String = - replace("&", "&") - .replace("<", "<") - .replace(">", ">") - .replace("\"", """) - .replace("'", "'") - private val versionSegmentPattern = Regex("""\d+|\D+""") -private val dependencyVersionComparator = +internal val dependencyVersionComparator = Comparator { first, second -> val firstSegments = versionSegmentPattern.findAll(first).map(MatchResult::value).toList() val secondSegments = versionSegmentPattern.findAll(second).map(MatchResult::value).toList() @@ -384,7 +257,7 @@ private val dependencyVersionComparator = .firstNotNullOfOrNull { (firstSegment, secondSegment) -> compareVersionSegments(firstSegment, secondSegment).takeIf { it != 0 } } - ?: firstSegments.size.compareTo(secondSegments.size) + ?: compareUnmatchedVersionSegments(firstSegments, secondSegments) } private val resolvedVersionComparator = @@ -408,6 +281,28 @@ private fun compareVersionSegments(first: String, second: String): Int { ?: normalizedFirst.compareTo(normalizedSecond) } +private fun compareUnmatchedVersionSegments( + first: List, + second: List, +): Int { + val sharedSegmentCount = minOf(first.size, second.size) + val unmatched = + if (first.size > second.size) { + first.drop(sharedSegmentCount) + } else { + second.drop(sharedSegmentCount) + } + val order = + when { + unmatched.any { segment -> segment.any(Char::isLetter) } -> -1 + unmatched.any { segment -> + segment.all(Char::isDigit) && segment.any { character -> character != '0' } + } -> 1 + else -> 0 + } + return if (first.size > second.size) order else -order +} + private fun DeclaredDependency.toTaskInput(): String = encodeTaskInput( group, @@ -420,13 +315,12 @@ private fun ResolvedVersion.toTaskInput(): String = encodeTaskInput(group, artifact, version) private fun String.toDeclaredDependency(): DeclaredDependency { - val (group, artifact, configuredVersion, configurationName) = - decodeTaskInput(expectedFieldCount = 4) + val fields = decodeTaskInput(expectedFieldCount = 4) return DeclaredDependency( - group = group, - artifact = artifact, - configuredVersion = configuredVersion.takeIf(String::isNotEmpty), - configurationName = configurationName, + group = fields[0], + artifact = fields[1], + configuredVersion = fields[2].takeIf(String::isNotEmpty), + configurationName = fields[3], ) } @@ -435,7 +329,7 @@ private fun String.toResolvedVersion(): ResolvedVersion { return ResolvedVersion(group, artifact, version) } -private fun encodeTaskInput(vararg fields: String): String = +internal fun encodeTaskInput(vararg fields: String): String = buildString { fields.forEach { field -> append(field.length) @@ -444,7 +338,7 @@ private fun encodeTaskInput(vararg fields: String): String = } } -private fun String.decodeTaskInput(expectedFieldCount: Int): List { +internal fun String.decodeTaskInput(expectedFieldCount: Int): List { val fields = ArrayList(expectedFieldCount) var offset = 0 repeat(expectedFieldCount) { diff --git a/buildSrc/src/test/kotlin/io/spine/embedcode/gradle/report/GenerateDependencyPomSpec.kt b/buildSrc/src/test/kotlin/io/spine/embedcode/gradle/report/GenerateDependencyPomSpec.kt index 3943047..6328e2d 100644 --- a/buildSrc/src/test/kotlin/io/spine/embedcode/gradle/report/GenerateDependencyPomSpec.kt +++ b/buildSrc/src/test/kotlin/io/spine/embedcode/gradle/report/GenerateDependencyPomSpec.kt @@ -26,15 +26,27 @@ package io.spine.embedcode.gradle.report +import java.nio.charset.StandardCharsets.UTF_8 +import java.nio.file.Files +import java.nio.file.Path +import org.gradle.api.Action +import org.gradle.api.Project +import org.gradle.api.artifacts.repositories.MavenArtifactRepository import org.gradle.testfixtures.ProjectBuilder import org.junit.jupiter.api.Assertions.assertEquals +import org.junit.jupiter.api.Assertions.assertFalse +import org.junit.jupiter.api.Assertions.assertThrows import org.junit.jupiter.api.Assertions.assertTrue import org.junit.jupiter.api.DisplayName import org.junit.jupiter.api.Test +import org.junit.jupiter.api.io.TempDir @DisplayName("Aggregate dependency POM generation should") internal class GenerateDependencyPomSpec { + @TempDir + lateinit var repositoryRoot: Path + @Test fun `map build configurations to representative Maven scopes`() { assertEquals(MavenScope.COMPILE, mavenScope("implementation")) @@ -57,29 +69,83 @@ internal class GenerateDependencyPomSpec { compileOnly.dependencies.add(project.dependencies.create(dependency)) testImplementation.dependencies.add(project.dependencies.create(dependency)) - val dependencies = collectDependencies(project.configurations) + val pom = generatePom(project) - assertEquals(1, dependencies.size) - assertEquals(MavenScope.PROVIDED, dependencies.single().scope) + assertEquals(1, "".toRegex().findAll(pom).count()) + assertTrue(pom.contains("shared")) + assertTrue(pom.contains("provided")) } @Test - fun `compare numeric version segments when selecting a declared version`() { + fun `use the resolved version from a configured dependency source`() { val project = ProjectBuilder.builder().build() val implementation = project.configurations.create("implementation") { - isCanBeResolved = false + isCanBeConsumed = false + isCanBeResolved = true } - val testImplementation = project.configurations.create("testImplementation") { - isCanBeResolved = false - } - implementation.dependencies.add(project.dependencies.create("org.example:shared:1.9")) - testImplementation.dependencies.add( - project.dependencies.create("org.example:shared:1.10"), + createMavenModule("org.example", "shared", "1.10") + project.repositories.maven( + Action { + setUrl(repositoryRoot.toUri()) + }, ) + implementation.resolutionStrategy.force("org.example:shared:1.10") + implementation.dependencies.add(project.dependencies.create("org.example:shared:1.9")) + + val pom = generatePom(project) + + assertTrue(pom.contains("1.10")) + assertFalse(pom.contains("1.9")) + } + + @Test + fun `compare numeric version segments numerically`() { + assertTrue(dependencyVersionComparator.compare("1.10", "1.9") > 0) + } + + @Test + fun `treat leading zeros as insignificant in numeric version segments`() { + assertEquals(0, dependencyVersionComparator.compare("1.09", "1.9")) + } + + @Test + fun `prefer release versions to their prereleases`() { + assertTrue(dependencyVersionComparator.compare("2.0.0", "2.0.0-alpha.5") > 0) + assertTrue(dependencyVersionComparator.compare("1.0.0", "1.0.0-RC1") > 0) + } + + @Test + fun `round trip task input fields with separators and empty values`() { + val fields = + listOf( + "org.example", + "shared:fixtures", + "", + "functionalTest:implementation", + ) - val dependency = collectDependencies(project.configurations).single() + val decoded = + encodeTaskInput(*fields.toTypedArray()) + .decodeTaskInput(expectedFieldCount = fields.size) + + assertEquals(fields, decoded) + } + + @Test + fun `reject malformed encoded task input`() { + val malformedInputs = + listOf( + "3abc", + "x:abc", + "4:abc", + "3:abc1:x", + ) - assertEquals("1.10", dependency.version) + malformedInputs.forEach { input -> + assertThrows(IllegalStateException::class.java) { + input.decodeTaskInput(expectedFieldCount = 1) + } + } } @Test @@ -116,4 +182,41 @@ internal class GenerateDependencyPomSpec { assertTrue(pom.contains("provided")) assertTrue(pom.contains("is not suitable for Maven build tasks")) } + + private fun generatePom(project: Project): String { + val task = + project.tasks + .register("generateDependencyPom", GenerateDependencyPom::class.java) + .get() + task.groupId.set("io.spine.tools") + task.artifactId.set("embed-code-gradle-plugin") + task.projectVersion.set("0.1.1") + task.outputFile.set(project.layout.buildDirectory.file("reports/dependencies/pom.xml")) + task.dependenciesFrom(project.configurations) + + task.generate() + + return Files.readString(task.outputFile.get().asFile.toPath(), UTF_8) + } + + private fun createMavenModule(group: String, artifact: String, version: String) { + val moduleDirectory = + repositoryRoot + .resolve(group.replace('.', '/')) + .resolve(artifact) + .resolve(version) + Files.createDirectories(moduleDirectory) + Files.writeString( + moduleDirectory.resolve("$artifact-$version.pom"), + """ + + 4.0.0 + $group + $artifact + $version + + """.trimIndent(), + UTF_8, + ) + } } diff --git a/dependencies.md b/dependencies.md index e28519f..5997961 100644 --- a/dependencies.md +++ b/dependencies.md @@ -7,231 +7,300 @@ ## Apache License, Version 2.0 -**2** **Group:** `com.github.ben-manes.caffeine` **Name:** `caffeine` **Version:** `2.9.3` +**2** **Group:** `com.fasterxml.jackson` **Name:** `jackson-bom` **Version:** `2.15.3` +> - **POM Project URL**: [https://github.com/FasterXML/jackson-bom](https://github.com/FasterXML/jackson-bom) +> - **POM License**: Apache License, Version 2.0 - [http://www.apache.org/licenses/LICENSE-2.0.txt](http://www.apache.org/licenses/LICENSE-2.0.txt) +> - **POM License**: The Apache Software License, Version 2.0 - [http://www.apache.org/licenses/LICENSE-2.0.txt](http://www.apache.org/licenses/LICENSE-2.0.txt) + +**3** **Group:** `com.fasterxml.jackson.core` **Name:** `jackson-core` **Version:** `2.15.3` +> - **Project URL**: [https://github.com/FasterXML/jackson-core](https://github.com/FasterXML/jackson-core) +> - **POM License**: Apache License, Version 2.0 - [http://www.apache.org/licenses/LICENSE-2.0.txt](http://www.apache.org/licenses/LICENSE-2.0.txt) +> - **POM License**: The Apache Software License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0.txt](https://www.apache.org/licenses/LICENSE-2.0.txt) +> - **Embedded license files**: `jackson-core-2.15.3.jar/META-INF/LICENSE` + - `jackson-core-2.15.3.jar/META-INF/NOTICE` + +**4** **Group:** `com.fasterxml.jackson.core` **Name:** `jackson-databind` **Version:** `2.15.3` +> - **Project URL**: [https://github.com/FasterXML/jackson](https://github.com/FasterXML/jackson) +> - **POM License**: Apache License, Version 2.0 - [http://www.apache.org/licenses/LICENSE-2.0.txt](http://www.apache.org/licenses/LICENSE-2.0.txt) +> - **POM License**: The Apache Software License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0.txt](https://www.apache.org/licenses/LICENSE-2.0.txt) +> - **Embedded license files**: `jackson-databind-2.15.3.jar/META-INF/LICENSE` + - `jackson-databind-2.15.3.jar/META-INF/NOTICE` + +**5** **Group:** `com.fasterxml.jackson.dataformat` **Name:** `jackson-dataformat-xml` **Version:** `2.15.3` +> - **Project URL**: [https://github.com/FasterXML/jackson-dataformat-xml](https://github.com/FasterXML/jackson-dataformat-xml) +> - **POM License**: Apache License, Version 2.0 - [http://www.apache.org/licenses/LICENSE-2.0.txt](http://www.apache.org/licenses/LICENSE-2.0.txt) +> - **POM License**: The Apache Software License, Version 2.0 - [http://www.apache.org/licenses/LICENSE-2.0.txt](http://www.apache.org/licenses/LICENSE-2.0.txt) +> - **Embedded license files**: `jackson-dataformat-xml-2.15.3.jar/META-INF/LICENSE` + - `jackson-dataformat-xml-2.15.3.jar/META-INF/NOTICE` + +**6** **Group:** `com.fasterxml.jackson.module` **Name:** `jackson-module-kotlin` **Version:** `2.15.3` +> - **Project URL**: [https://github.com/FasterXML/jackson-module-kotlin](https://github.com/FasterXML/jackson-module-kotlin) +> - **POM License**: Apache License, Version 2.0 - [http://www.apache.org/licenses/LICENSE-2.0.txt](http://www.apache.org/licenses/LICENSE-2.0.txt) +> - **POM License**: The Apache Software License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0.txt](https://www.apache.org/licenses/LICENSE-2.0.txt) +> - **Embedded license files**: `jackson-module-kotlin-2.15.3.jar/META-INF/LICENSE` + - `jackson-module-kotlin-2.15.3.jar/META-INF/NOTICE` + +**7** **Group:** `com.github.ben-manes.caffeine` **Name:** `caffeine` **Version:** `2.9.3` > - **POM Project URL**: [https://github.com/ben-manes/caffeine](https://github.com/ben-manes/caffeine) > - **POM License**: Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0.txt](https://www.apache.org/licenses/LICENSE-2.0.txt) > - **Embedded license files**: `caffeine-2.9.3.jar/META-INF/LICENSE` -**3** **Group:** `org.jcommander` **Name:** `jcommander` **Version:** `1.85` +**8** **Group:** `org.freemarker` **Name:** `freemarker` **Version:** `2.3.32` +> - **Manifest License**: Apache License, Version 2.0; see: http://www.apache.org/licenses/LICENSE-2.0.txt +> - **POM Project URL**: [https://freemarker.apache.org/](https://freemarker.apache.org/) +> - **POM License**: Apache License, Version 2.0 - [http://www.apache.org/licenses/LICENSE-2.0.txt](http://www.apache.org/licenses/LICENSE-2.0.txt) +> - **Embedded license files**: `freemarker-2.3.32.jar/META-INF/LICENSE` + +**9** **Group:** `org.jcommander` **Name:** `jcommander` **Version:** `1.85` > - **POM Project URL**: [https://jcommander.org](https://jcommander.org) > - **POM License**: Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0.txt](https://www.apache.org/licenses/LICENSE-2.0.txt) -**4** **Group:** `org.snakeyaml` **Name:** `snakeyaml-engine` **Version:** `2.10` +**10** **Group:** `org.snakeyaml` **Name:** `snakeyaml-engine` **Version:** `2.10` > - **POM Project URL**: [https://bitbucket.org/snakeyaml/snakeyaml-engine](https://bitbucket.org/snakeyaml/snakeyaml-engine) > - **POM License**: Apache License, Version 2.0 - [http://www.apache.org/licenses/LICENSE-2.0.txt](http://www.apache.org/licenses/LICENSE-2.0.txt) ## Apache-2.0 -**5** **Group:** `org.jetbrains.intellij.deps.kotlinx` **Name:** `kotlinx-coroutines-bom` **Version:** `1.10.2-intellij-1` +**11** **Group:** `org.jetbrains.intellij.deps.kotlinx` **Name:** `kotlinx-coroutines-bom` **Version:** `1.10.2-intellij-1` > - **POM Project URL**: [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines) > - **POM License**: Apache-2.0 - [https://www.apache.org/licenses/LICENSE-2.0.txt](https://www.apache.org/licenses/LICENSE-2.0.txt) -**6** **Group:** `org.jetbrains.intellij.deps.kotlinx` **Name:** `kotlinx-coroutines-core` **Version:** `1.10.2-intellij-1` +**12** **Group:** `org.jetbrains.intellij.deps.kotlinx` **Name:** `kotlinx-coroutines-core` **Version:** `1.10.2-intellij-1` > - **POM Project URL**: [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines) > - **POM License**: Apache-2.0 - [https://www.apache.org/licenses/LICENSE-2.0.txt](https://www.apache.org/licenses/LICENSE-2.0.txt) -**7** **Group:** `org.jetbrains.intellij.deps.kotlinx` **Name:** `kotlinx-coroutines-core-jvm` **Version:** `1.10.2-intellij-1` +**13** **Group:** `org.jetbrains.intellij.deps.kotlinx` **Name:** `kotlinx-coroutines-core-jvm` **Version:** `1.10.2-intellij-1` > - **POM Project URL**: [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines) > - **POM License**: Apache-2.0 - [https://www.apache.org/licenses/LICENSE-2.0.txt](https://www.apache.org/licenses/LICENSE-2.0.txt) -**8** **Group:** `org.jetbrains.kotlin` **Name:** `kotlin-build-tools-api` **Version:** `2.4.0` +**14** **Group:** `org.jetbrains.kotlin` **Name:** `kotlin-build-tools-api` **Version:** `2.4.0` > - **POM Project URL**: [https://kotlinlang.org/](https://kotlinlang.org/) > - **POM License**: Apache-2.0 - [http://www.apache.org/licenses/LICENSE-2.0.txt](http://www.apache.org/licenses/LICENSE-2.0.txt) -**9** **Group:** `org.jetbrains.kotlin` **Name:** `kotlin-build-tools-api` **Version:** `2.4.10` +**15** **Group:** `org.jetbrains.kotlin` **Name:** `kotlin-build-tools-api` **Version:** `2.4.10` > - **POM Project URL**: [https://kotlinlang.org/](https://kotlinlang.org/) > - **POM License**: Apache-2.0 - [http://www.apache.org/licenses/LICENSE-2.0.txt](http://www.apache.org/licenses/LICENSE-2.0.txt) -**10** **Group:** `org.jetbrains.kotlin` **Name:** `kotlin-build-tools-compat` **Version:** `2.4.10` +**16** **Group:** `org.jetbrains.kotlin` **Name:** `kotlin-build-tools-compat` **Version:** `2.4.10` > - **POM Project URL**: [https://kotlinlang.org/](https://kotlinlang.org/) > - **POM License**: Apache-2.0 - [http://www.apache.org/licenses/LICENSE-2.0.txt](http://www.apache.org/licenses/LICENSE-2.0.txt) -**11** **Group:** `org.jetbrains.kotlin` **Name:** `kotlin-build-tools-cri-impl` **Version:** `2.4.0` +**17** **Group:** `org.jetbrains.kotlin` **Name:** `kotlin-build-tools-cri-impl` **Version:** `2.4.0` > - **POM Project URL**: [https://kotlinlang.org/](https://kotlinlang.org/) > - **POM License**: Apache-2.0 - [http://www.apache.org/licenses/LICENSE-2.0.txt](http://www.apache.org/licenses/LICENSE-2.0.txt) -**12** **Group:** `org.jetbrains.kotlin` **Name:** `kotlin-build-tools-cri-impl` **Version:** `2.4.10` +**18** **Group:** `org.jetbrains.kotlin` **Name:** `kotlin-build-tools-cri-impl` **Version:** `2.4.10` > - **POM Project URL**: [https://kotlinlang.org/](https://kotlinlang.org/) > - **POM License**: Apache-2.0 - [http://www.apache.org/licenses/LICENSE-2.0.txt](http://www.apache.org/licenses/LICENSE-2.0.txt) -**13** **Group:** `org.jetbrains.kotlin` **Name:** `kotlin-build-tools-impl` **Version:** `2.4.0` +**19** **Group:** `org.jetbrains.kotlin` **Name:** `kotlin-build-tools-impl` **Version:** `2.4.0` > - **POM Project URL**: [https://kotlinlang.org/](https://kotlinlang.org/) > - **POM License**: Apache-2.0 - [http://www.apache.org/licenses/LICENSE-2.0.txt](http://www.apache.org/licenses/LICENSE-2.0.txt) -**14** **Group:** `org.jetbrains.kotlin` **Name:** `kotlin-build-tools-impl` **Version:** `2.4.10` +**20** **Group:** `org.jetbrains.kotlin` **Name:** `kotlin-build-tools-impl` **Version:** `2.4.10` > - **POM Project URL**: [https://kotlinlang.org/](https://kotlinlang.org/) > - **POM License**: Apache-2.0 - [http://www.apache.org/licenses/LICENSE-2.0.txt](http://www.apache.org/licenses/LICENSE-2.0.txt) -**15** **Group:** `org.jetbrains.kotlin` **Name:** `kotlin-compiler` **Version:** `2.4.0` +**21** **Group:** `org.jetbrains.kotlin` **Name:** `kotlin-compiler` **Version:** `2.4.0` > - **POM Project URL**: [https://kotlinlang.org/](https://kotlinlang.org/) > - **POM License**: Apache-2.0 - [http://www.apache.org/licenses/LICENSE-2.0.txt](http://www.apache.org/licenses/LICENSE-2.0.txt) -**16** **Group:** `org.jetbrains.kotlin` **Name:** `kotlin-compiler-embeddable` **Version:** `2.4.0` +**22** **Group:** `org.jetbrains.kotlin` **Name:** `kotlin-compiler-embeddable` **Version:** `2.4.0` > - **POM Project URL**: [https://kotlinlang.org/](https://kotlinlang.org/) > - **POM License**: Apache-2.0 - [http://www.apache.org/licenses/LICENSE-2.0.txt](http://www.apache.org/licenses/LICENSE-2.0.txt) -**17** **Group:** `org.jetbrains.kotlin` **Name:** `kotlin-compiler-embeddable` **Version:** `2.4.10` +**23** **Group:** `org.jetbrains.kotlin` **Name:** `kotlin-compiler-embeddable` **Version:** `2.4.10` > - **POM Project URL**: [https://kotlinlang.org/](https://kotlinlang.org/) > - **POM License**: Apache-2.0 - [http://www.apache.org/licenses/LICENSE-2.0.txt](http://www.apache.org/licenses/LICENSE-2.0.txt) -**18** **Group:** `org.jetbrains.kotlin` **Name:** `kotlin-compiler-runner` **Version:** `2.4.0` +**24** **Group:** `org.jetbrains.kotlin` **Name:** `kotlin-compiler-runner` **Version:** `2.4.0` > - **POM Project URL**: [https://kotlinlang.org/](https://kotlinlang.org/) > - **POM License**: Apache-2.0 - [http://www.apache.org/licenses/LICENSE-2.0.txt](http://www.apache.org/licenses/LICENSE-2.0.txt) -**19** **Group:** `org.jetbrains.kotlin` **Name:** `kotlin-compiler-runner` **Version:** `2.4.10` +**25** **Group:** `org.jetbrains.kotlin` **Name:** `kotlin-compiler-runner` **Version:** `2.4.10` > - **POM Project URL**: [https://kotlinlang.org/](https://kotlinlang.org/) > - **POM License**: Apache-2.0 - [http://www.apache.org/licenses/LICENSE-2.0.txt](http://www.apache.org/licenses/LICENSE-2.0.txt) -**20** **Group:** `org.jetbrains.kotlin` **Name:** `kotlin-daemon-client` **Version:** `2.4.0` +**26** **Group:** `org.jetbrains.kotlin` **Name:** `kotlin-daemon-client` **Version:** `2.4.0` > - **POM Project URL**: [https://kotlinlang.org/](https://kotlinlang.org/) > - **POM License**: Apache-2.0 - [http://www.apache.org/licenses/LICENSE-2.0.txt](http://www.apache.org/licenses/LICENSE-2.0.txt) -**21** **Group:** `org.jetbrains.kotlin` **Name:** `kotlin-daemon-client` **Version:** `2.4.10` +**27** **Group:** `org.jetbrains.kotlin` **Name:** `kotlin-daemon-client` **Version:** `2.4.10` > - **POM Project URL**: [https://kotlinlang.org/](https://kotlinlang.org/) > - **POM License**: Apache-2.0 - [http://www.apache.org/licenses/LICENSE-2.0.txt](http://www.apache.org/licenses/LICENSE-2.0.txt) -**22** **Group:** `org.jetbrains.kotlin` **Name:** `kotlin-daemon-embeddable` **Version:** `2.4.0` +**28** **Group:** `org.jetbrains.kotlin` **Name:** `kotlin-daemon-embeddable` **Version:** `2.4.0` > - **POM Project URL**: [https://kotlinlang.org/](https://kotlinlang.org/) > - **POM License**: Apache-2.0 - [http://www.apache.org/licenses/LICENSE-2.0.txt](http://www.apache.org/licenses/LICENSE-2.0.txt) -**23** **Group:** `org.jetbrains.kotlin` **Name:** `kotlin-daemon-embeddable` **Version:** `2.4.10` +**29** **Group:** `org.jetbrains.kotlin` **Name:** `kotlin-daemon-embeddable` **Version:** `2.4.10` > - **POM Project URL**: [https://kotlinlang.org/](https://kotlinlang.org/) > - **POM License**: Apache-2.0 - [http://www.apache.org/licenses/LICENSE-2.0.txt](http://www.apache.org/licenses/LICENSE-2.0.txt) -**24** **Group:** `org.jetbrains.kotlin` **Name:** `kotlin-klib-commonizer-embeddable` **Version:** `2.4.10` +**30** **Group:** `org.jetbrains.kotlin` **Name:** `kotlin-klib-commonizer-embeddable` **Version:** `2.4.10` > - **POM Project URL**: [https://kotlinlang.org/](https://kotlinlang.org/) > - **POM License**: Apache-2.0 - [http://www.apache.org/licenses/LICENSE-2.0.txt](http://www.apache.org/licenses/LICENSE-2.0.txt) -**25** **Group:** `org.jetbrains.kotlin` **Name:** `kotlin-reflect` **Version:** `2.4.0` +**31** **Group:** `org.jetbrains.kotlin` **Name:** `kotlin-reflect` **Version:** `2.4.0` > - **POM Project URL**: [https://kotlinlang.org/](https://kotlinlang.org/) > - **POM License**: Apache-2.0 - [http://www.apache.org/licenses/LICENSE-2.0.txt](http://www.apache.org/licenses/LICENSE-2.0.txt) -**26** **Group:** `org.jetbrains.kotlin` **Name:** `kotlin-script-runtime` **Version:** `2.4.0` +**32** **Group:** `org.jetbrains.kotlin` **Name:** `kotlin-script-runtime` **Version:** `2.4.0` > - **POM Project URL**: [https://kotlinlang.org/](https://kotlinlang.org/) > - **POM License**: Apache-2.0 - [http://www.apache.org/licenses/LICENSE-2.0.txt](http://www.apache.org/licenses/LICENSE-2.0.txt) -**27** **Group:** `org.jetbrains.kotlin` **Name:** `kotlin-script-runtime` **Version:** `2.4.10` +**33** **Group:** `org.jetbrains.kotlin` **Name:** `kotlin-script-runtime` **Version:** `2.4.10` > - **POM Project URL**: [https://kotlinlang.org/](https://kotlinlang.org/) > - **POM License**: Apache-2.0 - [http://www.apache.org/licenses/LICENSE-2.0.txt](http://www.apache.org/licenses/LICENSE-2.0.txt) -**28** **Group:** `org.jetbrains.kotlin` **Name:** `kotlin-scripting-common` **Version:** `2.4.10` +**34** **Group:** `org.jetbrains.kotlin` **Name:** `kotlin-scripting-common` **Version:** `2.4.10` > - **POM Project URL**: [https://kotlinlang.org/](https://kotlinlang.org/) > - **POM License**: Apache-2.0 - [http://www.apache.org/licenses/LICENSE-2.0.txt](http://www.apache.org/licenses/LICENSE-2.0.txt) -**29** **Group:** `org.jetbrains.kotlin` **Name:** `kotlin-scripting-compiler-embeddable` **Version:** `2.4.10` +**35** **Group:** `org.jetbrains.kotlin` **Name:** `kotlin-scripting-compiler-embeddable` **Version:** `2.4.10` > - **POM Project URL**: [https://kotlinlang.org/](https://kotlinlang.org/) > - **POM License**: Apache-2.0 - [http://www.apache.org/licenses/LICENSE-2.0.txt](http://www.apache.org/licenses/LICENSE-2.0.txt) -**30** **Group:** `org.jetbrains.kotlin` **Name:** `kotlin-scripting-compiler-impl-embeddable` **Version:** `2.4.10` +**36** **Group:** `org.jetbrains.kotlin` **Name:** `kotlin-scripting-compiler-impl-embeddable` **Version:** `2.4.10` > - **POM Project URL**: [https://kotlinlang.org/](https://kotlinlang.org/) > - **POM License**: Apache-2.0 - [http://www.apache.org/licenses/LICENSE-2.0.txt](http://www.apache.org/licenses/LICENSE-2.0.txt) -**31** **Group:** `org.jetbrains.kotlin` **Name:** `kotlin-scripting-jvm` **Version:** `2.4.10` +**37** **Group:** `org.jetbrains.kotlin` **Name:** `kotlin-scripting-jvm` **Version:** `2.4.10` > - **POM Project URL**: [https://kotlinlang.org/](https://kotlinlang.org/) > - **POM License**: Apache-2.0 - [http://www.apache.org/licenses/LICENSE-2.0.txt](http://www.apache.org/licenses/LICENSE-2.0.txt) -**32** **Group:** `org.jetbrains.kotlin` **Name:** `kotlin-stdlib` **Version:** `2.4.0` +**38** **Group:** `org.jetbrains.kotlin` **Name:** `kotlin-stdlib` **Version:** `2.4.0` > - **POM Project URL**: [https://kotlinlang.org/](https://kotlinlang.org/) > - **POM License**: Apache-2.0 - [http://www.apache.org/licenses/LICENSE-2.0.txt](http://www.apache.org/licenses/LICENSE-2.0.txt) -**33** **Group:** `org.jetbrains.kotlin` **Name:** `kotlin-stdlib` **Version:** `2.4.10` +**39** **Group:** `org.jetbrains.kotlin` **Name:** `kotlin-stdlib` **Version:** `2.4.10` > - **POM Project URL**: [https://kotlinlang.org/](https://kotlinlang.org/) > - **POM License**: Apache-2.0 - [http://www.apache.org/licenses/LICENSE-2.0.txt](http://www.apache.org/licenses/LICENSE-2.0.txt) -**34** **Group:** `org.jetbrains.kotlin` **Name:** `kotlin-stdlib-jdk7` **Version:** `2.4.0` +**40** **Group:** `org.jetbrains.kotlin` **Name:** `kotlin-stdlib-jdk7` **Version:** `2.4.0` > - **POM Project URL**: [https://kotlinlang.org/](https://kotlinlang.org/) > - **POM License**: Apache-2.0 - [http://www.apache.org/licenses/LICENSE-2.0.txt](http://www.apache.org/licenses/LICENSE-2.0.txt) -**35** **Group:** `org.jetbrains.kotlin` **Name:** `kotlin-stdlib-jdk8` **Version:** `2.4.0` +**41** **Group:** `org.jetbrains.kotlin` **Name:** `kotlin-stdlib-jdk8` **Version:** `2.4.0` > - **POM Project URL**: [https://kotlinlang.org/](https://kotlinlang.org/) > - **POM License**: Apache-2.0 - [http://www.apache.org/licenses/LICENSE-2.0.txt](http://www.apache.org/licenses/LICENSE-2.0.txt) -**36** **Group:** `org.jetbrains.kotlin` **Name:** `kotlin-tooling-core` **Version:** `2.4.10` +**42** **Group:** `org.jetbrains.kotlin` **Name:** `kotlin-tooling-core` **Version:** `2.4.10` > - **POM Project URL**: [https://kotlinlang.org/](https://kotlinlang.org/) > - **POM License**: Apache-2.0 - [http://www.apache.org/licenses/LICENSE-2.0.txt](http://www.apache.org/licenses/LICENSE-2.0.txt) -**37** **Group:** `org.jetbrains.kotlinx` **Name:** `kotlinx-serialization-bom` **Version:** `1.11.0` +**43** **Group:** `org.jetbrains.kotlinx` **Name:** `kotlinx-serialization-bom` **Version:** `1.11.0` > - **POM Project URL**: [https://github.com/Kotlin/kotlinx.serialization](https://github.com/Kotlin/kotlinx.serialization) > - **POM License**: Apache-2.0 - [https://www.apache.org/licenses/LICENSE-2.0.txt](https://www.apache.org/licenses/LICENSE-2.0.txt) -**38** **Group:** `org.jetbrains.kotlinx` **Name:** `kotlinx-serialization-core` **Version:** `1.11.0` +**44** **Group:** `org.jetbrains.kotlinx` **Name:** `kotlinx-serialization-core` **Version:** `1.11.0` > - **POM Project URL**: [https://github.com/Kotlin/kotlinx.serialization](https://github.com/Kotlin/kotlinx.serialization) > - **POM License**: Apache-2.0 - [https://www.apache.org/licenses/LICENSE-2.0.txt](https://www.apache.org/licenses/LICENSE-2.0.txt) -**39** **Group:** `org.jetbrains.kotlinx` **Name:** `kotlinx-serialization-core-jvm` **Version:** `1.11.0` +**45** **Group:** `org.jetbrains.kotlinx` **Name:** `kotlinx-serialization-core-jvm` **Version:** `1.11.0` > - **POM Project URL**: [https://github.com/Kotlin/kotlinx.serialization](https://github.com/Kotlin/kotlinx.serialization) > - **POM License**: Apache-2.0 - [https://www.apache.org/licenses/LICENSE-2.0.txt](https://www.apache.org/licenses/LICENSE-2.0.txt) -**40** **Group:** `org.jetbrains.kotlinx` **Name:** `kotlinx-serialization-json` **Version:** `1.11.0` +**46** **Group:** `org.jetbrains.kotlinx` **Name:** `kotlinx-serialization-json` **Version:** `1.11.0` > - **POM Project URL**: [https://github.com/Kotlin/kotlinx.serialization](https://github.com/Kotlin/kotlinx.serialization) > - **POM License**: Apache-2.0 - [https://www.apache.org/licenses/LICENSE-2.0.txt](https://www.apache.org/licenses/LICENSE-2.0.txt) -**41** **Group:** `org.jetbrains.kotlinx` **Name:** `kotlinx-serialization-json-jvm` **Version:** `1.11.0` +**47** **Group:** `org.jetbrains.kotlinx` **Name:** `kotlinx-serialization-json-jvm` **Version:** `1.11.0` > - **POM Project URL**: [https://github.com/Kotlin/kotlinx.serialization](https://github.com/Kotlin/kotlinx.serialization) > - **POM License**: Apache-2.0 - [https://www.apache.org/licenses/LICENSE-2.0.txt](https://www.apache.org/licenses/LICENSE-2.0.txt) ## Eclipse Public License v2.0 -**42** **Group:** `org.junit` **Name:** `junit-bom` **Version:** `6.1.2` +**48** **Group:** `org.junit` **Name:** `junit-bom` **Version:** `6.1.2` > - **POM Project URL**: [https://junit.org/](https://junit.org/) > - **POM License**: Eclipse Public License v2.0 - [https://www.eclipse.org/legal/epl-v20.html](https://www.eclipse.org/legal/epl-v20.html) -**43** **Group:** `org.junit.jupiter` **Name:** `junit-jupiter` **Version:** `6.1.2` +**49** **Group:** `org.junit.jupiter` **Name:** `junit-jupiter` **Version:** `6.1.2` > - **POM Project URL**: [https://junit.org/](https://junit.org/) > - **POM License**: Eclipse Public License v2.0 - [https://www.eclipse.org/legal/epl-v20.html](https://www.eclipse.org/legal/epl-v20.html) > - **Embedded license files**: `junit-jupiter-6.1.2.jar/META-INF/LICENSE.md` -**44** **Group:** `org.junit.jupiter` **Name:** `junit-jupiter-api` **Version:** `6.1.2` +**50** **Group:** `org.junit.jupiter` **Name:** `junit-jupiter-api` **Version:** `6.1.2` > - **POM Project URL**: [https://junit.org/](https://junit.org/) > - **POM License**: Eclipse Public License v2.0 - [https://www.eclipse.org/legal/epl-v20.html](https://www.eclipse.org/legal/epl-v20.html) > - **Embedded license files**: `junit-jupiter-api-6.1.2.jar/META-INF/LICENSE.md` -**45** **Group:** `org.junit.jupiter` **Name:** `junit-jupiter-engine` **Version:** `6.1.2` +**51** **Group:** `org.junit.jupiter` **Name:** `junit-jupiter-engine` **Version:** `6.1.2` > - **POM Project URL**: [https://junit.org/](https://junit.org/) > - **POM License**: Eclipse Public License v2.0 - [https://www.eclipse.org/legal/epl-v20.html](https://www.eclipse.org/legal/epl-v20.html) > - **Embedded license files**: `junit-jupiter-engine-6.1.2.jar/META-INF/LICENSE.md` -**46** **Group:** `org.junit.jupiter` **Name:** `junit-jupiter-params` **Version:** `6.1.2` +**52** **Group:** `org.junit.jupiter` **Name:** `junit-jupiter-params` **Version:** `6.1.2` > - **POM Project URL**: [https://junit.org/](https://junit.org/) > - **POM License**: Eclipse Public License v2.0 - [https://www.eclipse.org/legal/epl-v20.html](https://www.eclipse.org/legal/epl-v20.html) > - **Embedded license files**: `junit-jupiter-params-6.1.2.jar/META-INF/LICENSE.md` -**47** **Group:** `org.junit.platform` **Name:** `junit-platform-commons` **Version:** `6.1.2` +**53** **Group:** `org.junit.platform` **Name:** `junit-platform-commons` **Version:** `6.1.2` > - **POM Project URL**: [https://junit.org/](https://junit.org/) > - **POM License**: Eclipse Public License v2.0 - [https://www.eclipse.org/legal/epl-v20.html](https://www.eclipse.org/legal/epl-v20.html) > - **Embedded license files**: `junit-platform-commons-6.1.2.jar/META-INF/LICENSE.md` -**48** **Group:** `org.junit.platform` **Name:** `junit-platform-engine` **Version:** `6.1.2` +**54** **Group:** `org.junit.platform` **Name:** `junit-platform-engine` **Version:** `6.1.2` > - **POM Project URL**: [https://junit.org/](https://junit.org/) > - **POM License**: Eclipse Public License v2.0 - [https://www.eclipse.org/legal/epl-v20.html](https://www.eclipse.org/legal/epl-v20.html) > - **Embedded license files**: `junit-platform-engine-6.1.2.jar/META-INF/LICENSE.md` -**49** **Group:** `org.junit.platform` **Name:** `junit-platform-launcher` **Version:** `6.1.2` +**55** **Group:** `org.junit.platform` **Name:** `junit-platform-launcher` **Version:** `6.1.2` > - **POM Project URL**: [https://junit.org/](https://junit.org/) > - **POM License**: Eclipse Public License v2.0 - [https://www.eclipse.org/legal/epl-v20.html](https://www.eclipse.org/legal/epl-v20.html) > - **Embedded license files**: `junit-platform-launcher-6.1.2.jar/META-INF/LICENSE.md` ## The Apache License, Version 2.0 -**50** **Group:** `org.apiguardian` **Name:** `apiguardian-api` **Version:** `1.1.2` +**56** **Group:** `com.fasterxml.woodstox` **Name:** `woodstox-core` **Version:** `6.5.1` +> - **Project URL**: [https://github.com/FasterXML/woodstox](https://github.com/FasterXML/woodstox) +> - **POM License**: The Apache License, Version 2.0 - [http://www.apache.org/licenses/LICENSE-2.0.txt](http://www.apache.org/licenses/LICENSE-2.0.txt) +> - **POM License**: The Apache Software License, Version 2.0 - [http://www.apache.org/licenses/LICENSE-2.0.txt](http://www.apache.org/licenses/LICENSE-2.0.txt) +> - **Embedded license files**: `woodstox-core-6.5.1.jar/META-INF/LICENSE` + +**57** **Group:** `org.apiguardian` **Name:** `apiguardian-api` **Version:** `1.1.2` > - **Project URL**: [https://github.com/apiguardian-team/apiguardian](https://github.com/apiguardian-team/apiguardian) > - **POM License**: The Apache License, Version 2.0 - [http://www.apache.org/licenses/LICENSE-2.0.txt](http://www.apache.org/licenses/LICENSE-2.0.txt) > - **Embedded license files**: `apiguardian-api-1.1.2.jar/META-INF/LICENSE` -**51** **Group:** `org.jetbrains.kotlin` **Name:** `kotlin-reflect` **Version:** `1.6.10` +**58** **Group:** `org.jetbrains.kotlin` **Name:** `kotlin-reflect` **Version:** `1.6.10` > - **POM Project URL**: [https://kotlinlang.org/](https://kotlinlang.org/) > - **POM License**: The Apache License, Version 2.0 - [http://www.apache.org/licenses/LICENSE-2.0.txt](http://www.apache.org/licenses/LICENSE-2.0.txt) -**52** **Group:** `org.jetbrains.kotlinx` **Name:** `kotlinx-html-jvm` **Version:** `0.12.0` +**59** **Group:** `org.jetbrains.kotlin` **Name:** `kotlin-reflect` **Version:** `2.0.21` +> - **POM Project URL**: [https://kotlinlang.org/](https://kotlinlang.org/) +> - **POM License**: The Apache License, Version 2.0 - [http://www.apache.org/licenses/LICENSE-2.0.txt](http://www.apache.org/licenses/LICENSE-2.0.txt) + +**60** **Group:** `org.jetbrains.kotlin` **Name:** `kotlin-stdlib` **Version:** `2.0.21` +> - **POM Project URL**: [https://kotlinlang.org/](https://kotlinlang.org/) +> - **POM License**: The Apache License, Version 2.0 - [http://www.apache.org/licenses/LICENSE-2.0.txt](http://www.apache.org/licenses/LICENSE-2.0.txt) + +**61** **Group:** `org.jetbrains.kotlin` **Name:** `kotlin-stdlib-common` **Version:** `2.0.21` +> - **POM Project URL**: [https://kotlinlang.org/](https://kotlinlang.org/) +> - **POM License**: The Apache License, Version 2.0 - [http://www.apache.org/licenses/LICENSE-2.0.txt](http://www.apache.org/licenses/LICENSE-2.0.txt) + +**62** **Group:** `org.jetbrains.kotlin` **Name:** `kotlin-stdlib-jdk7` **Version:** `1.8.20` +> - **POM Project URL**: [https://kotlinlang.org/](https://kotlinlang.org/) +> - **POM License**: The Apache License, Version 2.0 - [http://www.apache.org/licenses/LICENSE-2.0.txt](http://www.apache.org/licenses/LICENSE-2.0.txt) + +**63** **Group:** `org.jetbrains.kotlin` **Name:** `kotlin-stdlib-jdk8` **Version:** `1.8.20` +> - **POM Project URL**: [https://kotlinlang.org/](https://kotlinlang.org/) +> - **POM License**: The Apache License, Version 2.0 - [http://www.apache.org/licenses/LICENSE-2.0.txt](http://www.apache.org/licenses/LICENSE-2.0.txt) + +**64** **Group:** `org.jetbrains.kotlinx` **Name:** `kotlinx-html-jvm` **Version:** `0.12.0` +> - **POM Project URL**: [https://github.com/Kotlin/kotlinx.html](https://github.com/Kotlin/kotlinx.html) +> - **POM License**: The Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0.txt](https://www.apache.org/licenses/LICENSE-2.0.txt) + +**65** **Group:** `org.jetbrains.kotlinx` **Name:** `kotlinx-html-jvm` **Version:** `0.9.1` > - **POM Project URL**: [https://github.com/Kotlin/kotlinx.html](https://github.com/Kotlin/kotlinx.html) > - **POM License**: The Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0.txt](https://www.apache.org/licenses/LICENSE-2.0.txt) -**53** **Group:** `org.jspecify` **Name:** `jspecify` **Version:** `1.0.0` +**66** **Group:** `org.jspecify` **Name:** `jspecify` **Version:** `1.0.0` > - **Manifest Project URL**: [https://jspecify.dev/docs/start-here](https://jspecify.dev/docs/start-here) > - **POM Project URL**: [http://jspecify.org/](http://jspecify.org/) > - **POM License**: The Apache License, Version 2.0 - [http://www.apache.org/licenses/LICENSE-2.0.txt](http://www.apache.org/licenses/LICENSE-2.0.txt) -**54** **Group:** `org.opentest4j` **Name:** `opentest4j` **Version:** `1.3.0` +**67** **Group:** `org.opentest4j` **Name:** `opentest4j` **Version:** `1.3.0` > - **Manifest License**: The Apache License, Version 2.0 > - **POM Project URL**: [https://github.com/ota4j-team/opentest4j](https://github.com/ota4j-team/opentest4j) > - **POM License**: The Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0.txt](https://www.apache.org/licenses/LICENSE-2.0.txt) @@ -239,138 +308,249 @@ ## The Apache Software License, Version 2.0 -**55** **Group:** `dev.detekt` **Name:** `detekt-api` **Version:** `2.0.0-alpha.5` +**68** **Group:** `com.fasterxml.jackson` **Name:** `jackson-bom` **Version:** `2.15.3` +> - **POM Project URL**: [https://github.com/FasterXML/jackson-bom](https://github.com/FasterXML/jackson-bom) +> - **POM License**: Apache License, Version 2.0 - [http://www.apache.org/licenses/LICENSE-2.0.txt](http://www.apache.org/licenses/LICENSE-2.0.txt) +> - **POM License**: The Apache Software License, Version 2.0 - [http://www.apache.org/licenses/LICENSE-2.0.txt](http://www.apache.org/licenses/LICENSE-2.0.txt) + +**69** **Group:** `com.fasterxml.jackson.core` **Name:** `jackson-annotations` **Version:** `2.15.3` +> - **Project URL**: [https://github.com/FasterXML/jackson](https://github.com/FasterXML/jackson) +> - **POM License**: The Apache Software License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0.txt](https://www.apache.org/licenses/LICENSE-2.0.txt) +> - **Embedded license files**: `jackson-annotations-2.15.3.jar/META-INF/LICENSE` + - `jackson-annotations-2.15.3.jar/META-INF/NOTICE` + +**70** **Group:** `com.fasterxml.jackson.core` **Name:** `jackson-core` **Version:** `2.15.3` +> - **Project URL**: [https://github.com/FasterXML/jackson-core](https://github.com/FasterXML/jackson-core) +> - **POM License**: Apache License, Version 2.0 - [http://www.apache.org/licenses/LICENSE-2.0.txt](http://www.apache.org/licenses/LICENSE-2.0.txt) +> - **POM License**: The Apache Software License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0.txt](https://www.apache.org/licenses/LICENSE-2.0.txt) +> - **Embedded license files**: `jackson-core-2.15.3.jar/META-INF/LICENSE` + - `jackson-core-2.15.3.jar/META-INF/NOTICE` + +**71** **Group:** `com.fasterxml.jackson.core` **Name:** `jackson-databind` **Version:** `2.15.3` +> - **Project URL**: [https://github.com/FasterXML/jackson](https://github.com/FasterXML/jackson) +> - **POM License**: Apache License, Version 2.0 - [http://www.apache.org/licenses/LICENSE-2.0.txt](http://www.apache.org/licenses/LICENSE-2.0.txt) +> - **POM License**: The Apache Software License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0.txt](https://www.apache.org/licenses/LICENSE-2.0.txt) +> - **Embedded license files**: `jackson-databind-2.15.3.jar/META-INF/LICENSE` + - `jackson-databind-2.15.3.jar/META-INF/NOTICE` + +**72** **Group:** `com.fasterxml.jackson.dataformat` **Name:** `jackson-dataformat-xml` **Version:** `2.15.3` +> - **Project URL**: [https://github.com/FasterXML/jackson-dataformat-xml](https://github.com/FasterXML/jackson-dataformat-xml) +> - **POM License**: Apache License, Version 2.0 - [http://www.apache.org/licenses/LICENSE-2.0.txt](http://www.apache.org/licenses/LICENSE-2.0.txt) +> - **POM License**: The Apache Software License, Version 2.0 - [http://www.apache.org/licenses/LICENSE-2.0.txt](http://www.apache.org/licenses/LICENSE-2.0.txt) +> - **Embedded license files**: `jackson-dataformat-xml-2.15.3.jar/META-INF/LICENSE` + - `jackson-dataformat-xml-2.15.3.jar/META-INF/NOTICE` + +**73** **Group:** `com.fasterxml.jackson.module` **Name:** `jackson-module-kotlin` **Version:** `2.15.3` +> - **Project URL**: [https://github.com/FasterXML/jackson-module-kotlin](https://github.com/FasterXML/jackson-module-kotlin) +> - **POM License**: Apache License, Version 2.0 - [http://www.apache.org/licenses/LICENSE-2.0.txt](http://www.apache.org/licenses/LICENSE-2.0.txt) +> - **POM License**: The Apache Software License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0.txt](https://www.apache.org/licenses/LICENSE-2.0.txt) +> - **Embedded license files**: `jackson-module-kotlin-2.15.3.jar/META-INF/LICENSE` + - `jackson-module-kotlin-2.15.3.jar/META-INF/NOTICE` + +**74** **Group:** `com.fasterxml.woodstox` **Name:** `woodstox-core` **Version:** `6.5.1` +> - **Project URL**: [https://github.com/FasterXML/woodstox](https://github.com/FasterXML/woodstox) +> - **POM License**: The Apache License, Version 2.0 - [http://www.apache.org/licenses/LICENSE-2.0.txt](http://www.apache.org/licenses/LICENSE-2.0.txt) +> - **POM License**: The Apache Software License, Version 2.0 - [http://www.apache.org/licenses/LICENSE-2.0.txt](http://www.apache.org/licenses/LICENSE-2.0.txt) +> - **Embedded license files**: `woodstox-core-6.5.1.jar/META-INF/LICENSE` + +**75** **Group:** `dev.detekt` **Name:** `detekt-api` **Version:** `2.0.0-alpha.5` > - **POM Project URL**: [https://detekt.dev](https://detekt.dev) > - **POM License**: The Apache Software License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0.txt](https://www.apache.org/licenses/LICENSE-2.0.txt) -**56** **Group:** `dev.detekt` **Name:** `detekt-cli` **Version:** `2.0.0-alpha.5` +**76** **Group:** `dev.detekt` **Name:** `detekt-cli` **Version:** `2.0.0-alpha.5` > - **POM Project URL**: [https://detekt.dev](https://detekt.dev) > - **POM License**: The Apache Software License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0.txt](https://www.apache.org/licenses/LICENSE-2.0.txt) -**57** **Group:** `dev.detekt` **Name:** `detekt-core` **Version:** `2.0.0-alpha.5` +**77** **Group:** `dev.detekt` **Name:** `detekt-core` **Version:** `2.0.0-alpha.5` > - **POM Project URL**: [https://detekt.dev](https://detekt.dev) > - **POM License**: The Apache Software License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0.txt](https://www.apache.org/licenses/LICENSE-2.0.txt) -**58** **Group:** `dev.detekt` **Name:** `detekt-kotlin-analysis-api` **Version:** `2.0.0-alpha.5` +**78** **Group:** `dev.detekt` **Name:** `detekt-kotlin-analysis-api` **Version:** `2.0.0-alpha.5` > - **POM Project URL**: [https://detekt.dev](https://detekt.dev) > - **POM License**: The Apache Software License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0.txt](https://www.apache.org/licenses/LICENSE-2.0.txt) -**59** **Group:** `dev.detekt` **Name:** `detekt-kotlin-analysis-api-standalone` **Version:** `2.0.0-alpha.5` +**79** **Group:** `dev.detekt` **Name:** `detekt-kotlin-analysis-api-standalone` **Version:** `2.0.0-alpha.5` > - **POM Project URL**: [https://detekt.dev](https://detekt.dev) > - **POM License**: The Apache Software License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0.txt](https://www.apache.org/licenses/LICENSE-2.0.txt) -**60** **Group:** `dev.detekt` **Name:** `detekt-metrics` **Version:** `2.0.0-alpha.5` +**80** **Group:** `dev.detekt` **Name:** `detekt-metrics` **Version:** `2.0.0-alpha.5` > - **POM Project URL**: [https://detekt.dev](https://detekt.dev) > - **POM License**: The Apache Software License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0.txt](https://www.apache.org/licenses/LICENSE-2.0.txt) -**61** **Group:** `dev.detekt` **Name:** `detekt-parser` **Version:** `2.0.0-alpha.5` +**81** **Group:** `dev.detekt` **Name:** `detekt-parser` **Version:** `2.0.0-alpha.5` > - **POM Project URL**: [https://detekt.dev](https://detekt.dev) > - **POM License**: The Apache Software License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0.txt](https://www.apache.org/licenses/LICENSE-2.0.txt) -**62** **Group:** `dev.detekt` **Name:** `detekt-psi-utils` **Version:** `2.0.0-alpha.5` +**82** **Group:** `dev.detekt` **Name:** `detekt-psi-utils` **Version:** `2.0.0-alpha.5` > - **POM Project URL**: [https://detekt.dev](https://detekt.dev) > - **POM License**: The Apache Software License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0.txt](https://www.apache.org/licenses/LICENSE-2.0.txt) -**63** **Group:** `dev.detekt` **Name:** `detekt-report-checkstyle` **Version:** `2.0.0-alpha.5` +**83** **Group:** `dev.detekt` **Name:** `detekt-report-checkstyle` **Version:** `2.0.0-alpha.5` > - **POM Project URL**: [https://detekt.dev](https://detekt.dev) > - **POM License**: The Apache Software License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0.txt](https://www.apache.org/licenses/LICENSE-2.0.txt) -**64** **Group:** `dev.detekt` **Name:** `detekt-report-html` **Version:** `2.0.0-alpha.5` +**84** **Group:** `dev.detekt` **Name:** `detekt-report-html` **Version:** `2.0.0-alpha.5` > - **POM Project URL**: [https://detekt.dev](https://detekt.dev) > - **POM License**: The Apache Software License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0.txt](https://www.apache.org/licenses/LICENSE-2.0.txt) -**65** **Group:** `dev.detekt` **Name:** `detekt-report-markdown` **Version:** `2.0.0-alpha.5` +**85** **Group:** `dev.detekt` **Name:** `detekt-report-markdown` **Version:** `2.0.0-alpha.5` > - **POM Project URL**: [https://detekt.dev](https://detekt.dev) > - **POM License**: The Apache Software License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0.txt](https://www.apache.org/licenses/LICENSE-2.0.txt) -**66** **Group:** `dev.detekt` **Name:** `detekt-report-sarif` **Version:** `2.0.0-alpha.5` +**86** **Group:** `dev.detekt` **Name:** `detekt-report-sarif` **Version:** `2.0.0-alpha.5` > - **POM Project URL**: [https://detekt.dev](https://detekt.dev) > - **POM License**: The Apache Software License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0.txt](https://www.apache.org/licenses/LICENSE-2.0.txt) -**67** **Group:** `dev.detekt` **Name:** `detekt-rules` **Version:** `2.0.0-alpha.5` +**87** **Group:** `dev.detekt` **Name:** `detekt-rules` **Version:** `2.0.0-alpha.5` > - **POM Project URL**: [https://detekt.dev](https://detekt.dev) > - **POM License**: The Apache Software License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0.txt](https://www.apache.org/licenses/LICENSE-2.0.txt) -**68** **Group:** `dev.detekt` **Name:** `detekt-rules-comments` **Version:** `2.0.0-alpha.5` +**88** **Group:** `dev.detekt` **Name:** `detekt-rules-comments` **Version:** `2.0.0-alpha.5` > - **POM Project URL**: [https://detekt.dev](https://detekt.dev) > - **POM License**: The Apache Software License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0.txt](https://www.apache.org/licenses/LICENSE-2.0.txt) -**69** **Group:** `dev.detekt` **Name:** `detekt-rules-complexity` **Version:** `2.0.0-alpha.5` +**89** **Group:** `dev.detekt` **Name:** `detekt-rules-complexity` **Version:** `2.0.0-alpha.5` > - **POM Project URL**: [https://detekt.dev](https://detekt.dev) > - **POM License**: The Apache Software License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0.txt](https://www.apache.org/licenses/LICENSE-2.0.txt) -**70** **Group:** `dev.detekt` **Name:** `detekt-rules-coroutines` **Version:** `2.0.0-alpha.5` +**90** **Group:** `dev.detekt` **Name:** `detekt-rules-coroutines` **Version:** `2.0.0-alpha.5` > - **POM Project URL**: [https://detekt.dev](https://detekt.dev) > - **POM License**: The Apache Software License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0.txt](https://www.apache.org/licenses/LICENSE-2.0.txt) -**71** **Group:** `dev.detekt` **Name:** `detekt-rules-empty-blocks` **Version:** `2.0.0-alpha.5` +**91** **Group:** `dev.detekt` **Name:** `detekt-rules-empty-blocks` **Version:** `2.0.0-alpha.5` > - **POM Project URL**: [https://detekt.dev](https://detekt.dev) > - **POM License**: The Apache Software License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0.txt](https://www.apache.org/licenses/LICENSE-2.0.txt) -**72** **Group:** `dev.detekt` **Name:** `detekt-rules-exceptions` **Version:** `2.0.0-alpha.5` +**92** **Group:** `dev.detekt` **Name:** `detekt-rules-exceptions` **Version:** `2.0.0-alpha.5` > - **POM Project URL**: [https://detekt.dev](https://detekt.dev) > - **POM License**: The Apache Software License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0.txt](https://www.apache.org/licenses/LICENSE-2.0.txt) -**73** **Group:** `dev.detekt` **Name:** `detekt-rules-naming` **Version:** `2.0.0-alpha.5` +**93** **Group:** `dev.detekt` **Name:** `detekt-rules-naming` **Version:** `2.0.0-alpha.5` > - **POM Project URL**: [https://detekt.dev](https://detekt.dev) > - **POM License**: The Apache Software License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0.txt](https://www.apache.org/licenses/LICENSE-2.0.txt) -**74** **Group:** `dev.detekt` **Name:** `detekt-rules-performance` **Version:** `2.0.0-alpha.5` +**94** **Group:** `dev.detekt` **Name:** `detekt-rules-performance` **Version:** `2.0.0-alpha.5` > - **POM Project URL**: [https://detekt.dev](https://detekt.dev) > - **POM License**: The Apache Software License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0.txt](https://www.apache.org/licenses/LICENSE-2.0.txt) -**75** **Group:** `dev.detekt` **Name:** `detekt-rules-potential-bugs` **Version:** `2.0.0-alpha.5` +**95** **Group:** `dev.detekt` **Name:** `detekt-rules-potential-bugs` **Version:** `2.0.0-alpha.5` > - **POM Project URL**: [https://detekt.dev](https://detekt.dev) > - **POM License**: The Apache Software License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0.txt](https://www.apache.org/licenses/LICENSE-2.0.txt) -**76** **Group:** `dev.detekt` **Name:** `detekt-rules-style` **Version:** `2.0.0-alpha.5` +**96** **Group:** `dev.detekt` **Name:** `detekt-rules-style` **Version:** `2.0.0-alpha.5` > - **POM Project URL**: [https://detekt.dev](https://detekt.dev) > - **POM License**: The Apache Software License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0.txt](https://www.apache.org/licenses/LICENSE-2.0.txt) -**77** **Group:** `dev.detekt` **Name:** `detekt-tooling` **Version:** `2.0.0-alpha.5` +**97** **Group:** `dev.detekt` **Name:** `detekt-tooling` **Version:** `2.0.0-alpha.5` > - **POM Project URL**: [https://detekt.dev](https://detekt.dev) > - **POM License**: The Apache Software License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0.txt](https://www.apache.org/licenses/LICENSE-2.0.txt) -**78** **Group:** `dev.detekt` **Name:** `detekt-utils` **Version:** `2.0.0-alpha.5` +**98** **Group:** `dev.detekt` **Name:** `detekt-utils` **Version:** `2.0.0-alpha.5` > - **POM Project URL**: [https://detekt.dev](https://detekt.dev) > - **POM License**: The Apache Software License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0.txt](https://www.apache.org/licenses/LICENSE-2.0.txt) -**79** **Group:** `dev.drewhamilton.poko` **Name:** `poko-annotations` **Version:** `0.23.1` +**99** **Group:** `dev.drewhamilton.poko` **Name:** `poko-annotations` **Version:** `0.23.1` > - **POM Project URL**: [https://github.com/drewhamilton/Poko](https://github.com/drewhamilton/Poko) > - **POM License**: The Apache Software License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0.txt](https://www.apache.org/licenses/LICENSE-2.0.txt) -**80** **Group:** `dev.drewhamilton.poko` **Name:** `poko-annotations-jvm` **Version:** `0.23.1` +**100** **Group:** `dev.drewhamilton.poko` **Name:** `poko-annotations-jvm` **Version:** `0.23.1` > - **POM Project URL**: [https://github.com/drewhamilton/Poko](https://github.com/drewhamilton/Poko) > - **POM License**: The Apache Software License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0.txt](https://www.apache.org/licenses/LICENSE-2.0.txt) -**81** **Group:** `io.github.detekt.sarif4k` **Name:** `sarif4k` **Version:** `0.6.0` +**101** **Group:** `io.github.detekt.sarif4k` **Name:** `sarif4k` **Version:** `0.6.0` > - **POM Project URL**: [https://detekt.github.io/detekt](https://detekt.github.io/detekt) > - **POM License**: The Apache Software License, Version 2.0 - [http://www.apache.org/licenses/LICENSE-2.0.txt](http://www.apache.org/licenses/LICENSE-2.0.txt) -**82** **Group:** `io.github.detekt.sarif4k` **Name:** `sarif4k-jvm` **Version:** `0.6.0` +**102** **Group:** `io.github.detekt.sarif4k` **Name:** `sarif4k-jvm` **Version:** `0.6.0` > - **POM Project URL**: [https://detekt.github.io/detekt](https://detekt.github.io/detekt) > - **POM License**: The Apache Software License, Version 2.0 - [http://www.apache.org/licenses/LICENSE-2.0.txt](http://www.apache.org/licenses/LICENSE-2.0.txt) -**83** **Group:** `org.jetbrains` **Name:** `annotations` **Version:** `13.0` +**103** **Group:** `org.codehaus.woodstox` **Name:** `stax2-api` **Version:** `4.2.1` +> - **Project URL**: [http://github.com/FasterXML/stax2-api](http://github.com/FasterXML/stax2-api) +> - **POM License**: The Apache Software License, Version 2.0 - [http://www.apache.org/licenses/LICENSE-2.0.txt](http://www.apache.org/licenses/LICENSE-2.0.txt) +> - **POM License**: The BSD License - [http://www.opensource.org/licenses/bsd-license.php](http://www.opensource.org/licenses/bsd-license.php) +> - **Embedded license files**: `stax2-api-4.2.1.jar/META-INF/LICENSE` + +**104** **Group:** `org.jetbrains` **Name:** `annotations` **Version:** `13.0` > - **POM Project URL**: [http://www.jetbrains.org](http://www.jetbrains.org) > - **POM License**: The Apache Software License, Version 2.0 - [http://www.apache.org/licenses/LICENSE-2.0.txt](http://www.apache.org/licenses/LICENSE-2.0.txt) -**84** **Group:** `org.jetbrains` **Name:** `annotations` **Version:** `23.0.0` +**105** **Group:** `org.jetbrains` **Name:** `annotations` **Version:** `23.0.0` > - **POM Project URL**: [https://github.com/JetBrains/java-annotations](https://github.com/JetBrains/java-annotations) > - **POM License**: The Apache Software License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0.txt](https://www.apache.org/licenses/LICENSE-2.0.txt) -**85** **Group:** `org.jetbrains.kotlinx` **Name:** `kotlinx-coroutines-bom` **Version:** `1.8.0` +**106** **Group:** `org.jetbrains` **Name:** `markdown` **Version:** `0.7.3` +> - **POM Project URL**: [https://github.com/JetBrains/markdown](https://github.com/JetBrains/markdown) +> - **POM License**: The Apache Software License, Version 2.0 - [http://www.apache.org/licenses/LICENSE-2.0.txt](http://www.apache.org/licenses/LICENSE-2.0.txt) + +**107** **Group:** `org.jetbrains` **Name:** `markdown-jvm` **Version:** `0.7.3` +> - **POM Project URL**: [https://github.com/JetBrains/markdown](https://github.com/JetBrains/markdown) +> - **POM License**: The Apache Software License, Version 2.0 - [http://www.apache.org/licenses/LICENSE-2.0.txt](http://www.apache.org/licenses/LICENSE-2.0.txt) + +**108** **Group:** `org.jetbrains.dokka` **Name:** `analysis-kotlin-symbols` **Version:** `2.2.0` +> - **POM Project URL**: [https://github.com/Kotlin/dokka](https://github.com/Kotlin/dokka) +> - **POM License**: The Apache Software License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0.txt](https://www.apache.org/licenses/LICENSE-2.0.txt) +> - **Embedded license files**: `analysis-kotlin-symbols-2.2.0.jar/META-INF/LICENSE` + - `analysis-kotlin-symbols-2.2.0.jar/META-INF/LICENSE.txt` + - `analysis-kotlin-symbols-2.2.0.jar/META-INF/NOTICE` + - `analysis-kotlin-symbols-2.2.0.jar/META-INF/NOTICE.txt` + - `analysis-kotlin-symbols-2.2.0.jar/META-INF/README.md` + - `analysis-kotlin-symbols-2.2.0.jar/org/apache/log4j/NOTICE` + +**109** **Group:** `org.jetbrains.dokka` **Name:** `analysis-markdown` **Version:** `2.2.0` +> - **POM Project URL**: [https://github.com/Kotlin/dokka](https://github.com/Kotlin/dokka) +> - **POM License**: The Apache Software License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0.txt](https://www.apache.org/licenses/LICENSE-2.0.txt) + +**110** **Group:** `org.jetbrains.dokka` **Name:** `dokka-base` **Version:** `2.2.0` +> - **POM Project URL**: [https://github.com/Kotlin/dokka](https://github.com/Kotlin/dokka) +> - **POM License**: The Apache Software License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0.txt](https://www.apache.org/licenses/LICENSE-2.0.txt) + +**111** **Group:** `org.jetbrains.dokka` **Name:** `dokka-core` **Version:** `2.2.0` +> - **POM Project URL**: [https://github.com/Kotlin/dokka](https://github.com/Kotlin/dokka) +> - **POM License**: The Apache Software License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0.txt](https://www.apache.org/licenses/LICENSE-2.0.txt) + +**112** **Group:** `org.jetbrains.dokka` **Name:** `templating-plugin` **Version:** `2.2.0` +> - **POM Project URL**: [https://github.com/Kotlin/dokka](https://github.com/Kotlin/dokka) +> - **POM License**: The Apache Software License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0.txt](https://www.apache.org/licenses/LICENSE-2.0.txt) + +**113** **Group:** `org.jetbrains.kotlinx` **Name:** `kotlinx-coroutines-bom` **Version:** `1.7.3` +> - **POM Project URL**: [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines) +> - **POM License**: The Apache Software License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0.txt](https://www.apache.org/licenses/LICENSE-2.0.txt) + +**114** **Group:** `org.jetbrains.kotlinx` **Name:** `kotlinx-coroutines-bom` **Version:** `1.8.0` > - **POM Project URL**: [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines) > - **POM License**: The Apache Software License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0.txt](https://www.apache.org/licenses/LICENSE-2.0.txt) -**86** **Group:** `org.jetbrains.kotlinx` **Name:** `kotlinx-coroutines-core-jvm` **Version:** `1.8.0` +**115** **Group:** `org.jetbrains.kotlinx` **Name:** `kotlinx-coroutines-core` **Version:** `1.7.3` > - **POM Project URL**: [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines) > - **POM License**: The Apache Software License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0.txt](https://www.apache.org/licenses/LICENSE-2.0.txt) +**116** **Group:** `org.jetbrains.kotlinx` **Name:** `kotlinx-coroutines-core-jvm` **Version:** `1.7.3` +> - **POM Project URL**: [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines) +> - **POM License**: The Apache Software License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0.txt](https://www.apache.org/licenses/LICENSE-2.0.txt) + +**117** **Group:** `org.jetbrains.kotlinx` **Name:** `kotlinx-coroutines-core-jvm` **Version:** `1.8.0` +> - **POM Project URL**: [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines) +> - **POM License**: The Apache Software License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0.txt](https://www.apache.org/licenses/LICENSE-2.0.txt) + +## The BSD License + +**118** **Group:** `org.codehaus.woodstox` **Name:** `stax2-api` **Version:** `4.2.1` +> - **Project URL**: [http://github.com/FasterXML/stax2-api](http://github.com/FasterXML/stax2-api) +> - **POM License**: The Apache Software License, Version 2.0 - [http://www.apache.org/licenses/LICENSE-2.0.txt](http://www.apache.org/licenses/LICENSE-2.0.txt) +> - **POM License**: The BSD License - [http://www.opensource.org/licenses/bsd-license.php](http://www.opensource.org/licenses/bsd-license.php) +> - **Embedded license files**: `stax2-api-4.2.1.jar/META-INF/LICENSE` + ## The MIT License -**87** **Group:** `org.checkerframework` **Name:** `checker-qual` **Version:** `3.19.0` +**119** **Group:** `org.checkerframework` **Name:** `checker-qual` **Version:** `3.19.0` > - **Manifest License**: MIT > - **POM Project URL**: [https://checkerframework.org](https://checkerframework.org) > - **POM License**: The MIT License - [http://opensource.org/licenses/MIT](http://opensource.org/licenses/MIT) > - **Embedded license files**: `checker-qual-3.19.0.jar/META-INF/LICENSE.txt` + +**120** **Group:** `org.jsoup` **Name:** `jsoup` **Version:** `1.16.1` +> - **Project URL**: [https://jsoup.org/](https://jsoup.org/) +> - **POM License**: The MIT License - [https://jsoup.org/license](https://jsoup.org/license) +> - **Embedded license files**: `jsoup-1.16.1.jar/META-INF/LICENSE` + - `jsoup-1.16.1.jar/META-INF/README.md` diff --git a/gradle-plugin/build.gradle.kts b/gradle-plugin/build.gradle.kts index a6429d7..84bf131 100644 --- a/gradle-plugin/build.gradle.kts +++ b/gradle-plugin/build.gradle.kts @@ -40,6 +40,7 @@ import org.gradle.plugin.compatibility.compatibility plugins { id("jvm-module") + id("dokka-configuration") `java-gradle-plugin` `maven-publish` } @@ -120,6 +121,18 @@ base { archivesName.set("embed-code-gradle-plugin") } +// Register the populated task before `withJavadocJar()` requests this conventional task name. +tasks.register("javadocJar") { + description = "Packages Kotlin API documentation generated by Dokka." + group = LifecycleBasePlugin.BUILD_GROUP + archiveClassifier.set("javadoc") + from( + tasks.dokkaGeneratePublicationHtml.flatMap { task -> + task.outputDirectory + }, + ) +} + java { withJavadocJar() withSourcesJar() diff --git a/pom.xml b/pom.xml index 82d7ab2..cfb82b2 100644 --- a/pom.xml +++ b/pom.xml @@ -37,6 +37,36 @@ 2.0.0-alpha.5 provided + + org.jetbrains.dokka + all-modules-page-plugin + 2.2.0 + provided + + + org.jetbrains.dokka + analysis-kotlin-symbols + 2.2.0 + provided + + + org.jetbrains.dokka + dokka-base + 2.2.0 + provided + + + org.jetbrains.dokka + dokka-core + 2.2.0 + provided + + + org.jetbrains.dokka + templating-plugin + 2.2.0 + provided + org.jetbrains.kotlin kotlin-build-tools-compat diff --git a/scripts/check_agent_config.py b/scripts/check_agent_config.py index 590da09..c103a09 100644 --- a/scripts/check_agent_config.py +++ b/scripts/check_agent_config.py @@ -15,6 +15,7 @@ SKILLS_DIRECTORY = Path(".agents/skills") CLAUDE_COMMANDS_DIRECTORY = Path(".claude/commands") AGENT_DOCUMENTS = ( + Path("README.md"), Path("AGENTS.md"), Path("PROJECT.md"), Path("CLAUDE.md"), @@ -403,6 +404,8 @@ def _validate_markdown_format(root: Path, files: list[Path]) -> list[Diagnostic] if ( open_fence is None and not is_fence + and REFERENCE_LINK_PATTERN.match(line) is None + and not line.lstrip().startswith("[![") and len(line.expandtabs(4)) > MAX_MARKDOWN_LINE_LENGTH ): diagnostics.append( diff --git a/scripts/tests/test_check_agent_config.py b/scripts/tests/test_check_agent_config.py index 2f97b98..ae66933 100644 --- a/scripts/tests/test_check_agent_config.py +++ b/scripts/tests/test_check_agent_config.py @@ -27,6 +27,12 @@ def setUp(self) -> None: --- # Alpha +""", + ) + self._write( + "README.md", + """\ +# Example project """, ) self._write( @@ -101,6 +107,7 @@ def test_reports_missing_required_paths(self) -> None: """Reject absent agent entry points and the canonical skills directory.""" for relative_path in ( + "README.md", "AGENTS.md", "PROJECT.md", "CLAUDE.md", @@ -393,6 +400,63 @@ def test_validates_claude_command_markdown(self) -> None: ) ) + def test_validates_readme_markdown(self) -> None: + """Apply link and formatting checks to the consumer README.""" + + self._write( + "README.md", + "\n".join( + ( + "# Example project", + "", + "Read [missing](missing.md).", + "x" * 101, + "", + ) + ), + ) + + messages = self._messages() + + self.assertTrue( + any( + "README.md:3: relative link target does not exist" in message + for message in messages + ) + ) + self.assertTrue( + any( + "README.md:4: line exceeds 100 characters" in message + for message in messages + ) + ) + + def test_ignores_machine_read_markdown_lines(self) -> None: + """Allow long badge markup and reference definitions.""" + + badge = ( + "[![license](https://img.shields.io/badge/" + + "license-" + + "x" * 100 + + ")](https://www.apache.org/licenses/LICENSE-2.0)" + ) + reference = "[license]: https://example.com/" + "x" * 100 + self._write( + "README.md", + "\n".join( + ( + badge, + "", + "# Example project", + "", + reference, + "", + ) + ), + ) + + self.assertEqual([], self._messages()) + def test_accepts_colliding_duplicate_heading_anchors(self) -> None: """Match GitHub suffixes when a heading collides with a generated anchor."""