From 98918348da156d1c57ec87d06d7a23d7ac82c240 Mon Sep 17 00:00:00 2001 From: Filipp Zhinkin Date: Tue, 16 Jan 2024 16:56:16 +0100 Subject: [PATCH 01/10] Support output directory configuration Fixes #127 --- .../kotlin/kotlinx/validation/api/TestDsl.kt | 3 +- .../validation/test/OutputDirectoryTests.kt | 138 ++++++++++++++++++ .../outputDirectory/different.gradle.kts | 8 + .../outputDirectory/subdirectory.gradle.kts | 8 + src/main/kotlin/ApiValidationExtension.kt | 6 + .../BinaryCompatibilityValidatorPlugin.kt | 18 +-- 6 files changed, 170 insertions(+), 11 deletions(-) create mode 100644 src/functionalTest/kotlin/kotlinx/validation/test/OutputDirectoryTests.kt create mode 100644 src/functionalTest/resources/examples/gradle/configuration/outputDirectory/different.gradle.kts create mode 100644 src/functionalTest/resources/examples/gradle/configuration/outputDirectory/subdirectory.gradle.kts diff --git a/src/functionalTest/kotlin/kotlinx/validation/api/TestDsl.kt b/src/functionalTest/kotlin/kotlinx/validation/api/TestDsl.kt index 11473782..8a70f946 100644 --- a/src/functionalTest/kotlin/kotlinx/validation/api/TestDsl.kt +++ b/src/functionalTest/kotlin/kotlinx/validation/api/TestDsl.kt @@ -5,11 +5,12 @@ package kotlinx.validation.api +import kotlinx.validation.ApiValidationExtension import java.io.* import org.gradle.testkit.runner.GradleRunner import org.intellij.lang.annotations.Language -public const val API_DIR: String = "api" +public val API_DIR: String = ApiValidationExtension().apiDumpDirectory internal fun BaseKotlinGradleTest.test(fn: BaseKotlinScope.() -> Unit): GradleRunner { val baseKotlinScope = BaseKotlinScope() diff --git a/src/functionalTest/kotlin/kotlinx/validation/test/OutputDirectoryTests.kt b/src/functionalTest/kotlin/kotlinx/validation/test/OutputDirectoryTests.kt new file mode 100644 index 00000000..bcfba33d --- /dev/null +++ b/src/functionalTest/kotlin/kotlinx/validation/test/OutputDirectoryTests.kt @@ -0,0 +1,138 @@ +/* + * Copyright 2016-2024 JetBrains s.r.o. + * Use of this source code is governed by the Apache 2.0 License that can be found in the LICENSE.txt file. + */ + +package kotlinx.validation.test + +import kotlinx.validation.api.* +import kotlinx.validation.api.buildGradleKts +import kotlinx.validation.api.resolve +import kotlinx.validation.api.test +import org.assertj.core.api.Assertions +import org.junit.Test +import kotlin.test.assertTrue + +class OutputDirectoryTests : BaseKotlinGradleTest() { + @Test + fun dumpIntoCustomDirectory() { + val runner = test { + buildGradleKts { + resolve("/examples/gradle/base/withPlugin.gradle.kts") + resolve("/examples/gradle/configuration/outputDirectory/different.gradle.kts") + } + + kotlin("AnotherBuildConfig.kt") { + resolve("/examples/classes/AnotherBuildConfig.kt") + } + dir("api") { + file("letMeBe.txt") { + } + } + + runner { + arguments.add(":apiDump") + } + } + + runner.build().apply { + assertTaskSuccess(":apiDump") + + val dumpFile = rootProjectDir.resolve("custom").resolve("${rootProjectDir.name}.api") + assertTrue(dumpFile.exists(), "api dump file ${dumpFile.path} should exist") + + val expected = readFileList("/examples/classes/AnotherBuildConfig.dump") + Assertions.assertThat(dumpFile.readText()).isEqualToIgnoringNewLines(expected) + + val fileInsideDir = rootProjectDir.resolve("api").resolve("letMeBe.txt") + assertTrue(fileInsideDir.exists(), "existing api directory should not be overridden") + } + } + + @Test + fun validateDumpFromACustomDirectory() { + val runner = test { + buildGradleKts { + resolve("/examples/gradle/base/withPlugin.gradle.kts") + resolve("/examples/gradle/configuration/outputDirectory/different.gradle.kts") + } + + kotlin("AnotherBuildConfig.kt") { + resolve("/examples/classes/AnotherBuildConfig.kt") + } + dir("custom") { + file("${rootProjectDir.name}.api") { + resolve("/examples/classes/AnotherBuildConfig.dump") + } + } + + runner { + arguments.add(":apiCheck") + } + } + + runner.build().apply { + assertTaskSuccess(":apiCheck") + } + } + + @Test + fun dumpIntoSubdirectory() { + val runner = test { + buildGradleKts { + resolve("/examples/gradle/base/withPlugin.gradle.kts") + resolve("/examples/gradle/configuration/outputDirectory/subdirectory.gradle.kts") + } + + kotlin("AnotherBuildConfig.kt") { + resolve("/examples/classes/AnotherBuildConfig.kt") + } + + runner { + arguments.add(":apiDump") + } + } + + runner.build().apply { + assertTaskSuccess(":apiDump") + + val dumpFile = rootProjectDir.resolve("validation") + .resolve("api") + .resolve("${rootProjectDir.name}.api") + + assertTrue(dumpFile.exists(), "api dump file ${dumpFile.path} should exist") + + val expected = readFileList("/examples/classes/AnotherBuildConfig.dump") + Assertions.assertThat(dumpFile.readText()).isEqualToIgnoringNewLines(expected) + } + } + + @Test + fun validateDumpFromASubdirectory() { + val runner = test { + buildGradleKts { + resolve("/examples/gradle/base/withPlugin.gradle.kts") + resolve("/examples/gradle/configuration/outputDirectory/subdirectory.gradle.kts") + } + + kotlin("AnotherBuildConfig.kt") { + resolve("/examples/classes/AnotherBuildConfig.kt") + } + dir("validation") { + dir("api") { + file("${rootProjectDir.name}.api") { + resolve("/examples/classes/AnotherBuildConfig.dump") + } + } + } + + runner { + arguments.add(":apiCheck") + } + } + + runner.build().apply { + assertTaskSuccess(":apiCheck") + } + } +} diff --git a/src/functionalTest/resources/examples/gradle/configuration/outputDirectory/different.gradle.kts b/src/functionalTest/resources/examples/gradle/configuration/outputDirectory/different.gradle.kts new file mode 100644 index 00000000..053038f8 --- /dev/null +++ b/src/functionalTest/resources/examples/gradle/configuration/outputDirectory/different.gradle.kts @@ -0,0 +1,8 @@ +/* + * Copyright 2016-2024 JetBrains s.r.o. + * Use of this source code is governed by the Apache 2.0 License that can be found in the LICENSE.txt file. + */ + +configure { + apiDumpDirectory = "custom" +} diff --git a/src/functionalTest/resources/examples/gradle/configuration/outputDirectory/subdirectory.gradle.kts b/src/functionalTest/resources/examples/gradle/configuration/outputDirectory/subdirectory.gradle.kts new file mode 100644 index 00000000..462671a0 --- /dev/null +++ b/src/functionalTest/resources/examples/gradle/configuration/outputDirectory/subdirectory.gradle.kts @@ -0,0 +1,8 @@ +/* + * Copyright 2016-2024 JetBrains s.r.o. + * Use of this source code is governed by the Apache 2.0 License that can be found in the LICENSE.txt file. + */ + +configure { + apiDumpDirectory = "validation/api" +} diff --git a/src/main/kotlin/ApiValidationExtension.kt b/src/main/kotlin/ApiValidationExtension.kt index e87c2688..b46b63b9 100644 --- a/src/main/kotlin/ApiValidationExtension.kt +++ b/src/main/kotlin/ApiValidationExtension.kt @@ -64,4 +64,10 @@ public open class ApiValidationExtension { * By default, only the `main` source set is checked. */ public var additionalSourceSets: MutableSet = HashSet() + + /** + * A path to a directory containing an API dump. + * The path should be relative to the project's root directory and by default it's `api`. + */ + public var apiDumpDirectory: String = "api" } diff --git a/src/main/kotlin/BinaryCompatibilityValidatorPlugin.kt b/src/main/kotlin/BinaryCompatibilityValidatorPlugin.kt index 05e9d863..38818d2e 100644 --- a/src/main/kotlin/BinaryCompatibilityValidatorPlugin.kt +++ b/src/main/kotlin/BinaryCompatibilityValidatorPlugin.kt @@ -13,8 +13,6 @@ import org.jetbrains.kotlin.gradle.dsl.* import org.jetbrains.kotlin.gradle.plugin.* import java.io.* -private const val API_DIR = "api" // Mirrored in functional tests - public class BinaryCompatibilityValidatorPlugin : Plugin { override fun apply(target: Project): Unit = with(target) { @@ -85,7 +83,7 @@ public class BinaryCompatibilityValidatorPlugin : Plugin { kotlin.targets.matching { it.platformType == KotlinPlatformType.jvm || it.platformType == KotlinPlatformType.androidJvm }.all { target -> - val targetConfig = TargetConfig(project, target.name, dirConfig) + val targetConfig = TargetConfig(project, extension, target.name, dirConfig) if (target.platformType == KotlinPlatformType.jvm) { target.compilations.matching { it.name == "main" }.all { project.configureKotlinCompilation(it, extension, targetConfig, commonApiDump, commonApiCheck) @@ -130,17 +128,17 @@ public class BinaryCompatibilityValidatorPlugin : Plugin { project: Project, extension: ApiValidationExtension ) = configurePlugin("kotlin", project, extension) { - project.configureApiTasks(extension, TargetConfig(project)) + project.configureApiTasks(extension, TargetConfig(project, extension)) } } private class TargetConfig constructor( project: Project, + extension: ApiValidationExtension, val targetName: String? = null, private val dirConfig: Provider? = null, ) { - - private val API_DIR_PROVIDER = project.provider { API_DIR } + private val API_DIR_PROVIDER = project.provider { extension.apiDumpDirectory } fun apiTaskName(suffix: String) = when (targetName) { null, "" -> "api$suffix" @@ -150,8 +148,8 @@ private class TargetConfig constructor( val apiDir get() = dirConfig?.map { dirConfig -> when (dirConfig) { - DirConfig.COMMON -> API_DIR - else -> "$API_DIR/$targetName" + DirConfig.COMMON -> API_DIR_PROVIDER.get() + else -> "${API_DIR_PROVIDER.get()}/$targetName" } } ?: API_DIR_PROVIDER } @@ -174,7 +172,7 @@ private enum class DirConfig { private fun Project.configureKotlinCompilation( compilation: KotlinCompilation, extension: ApiValidationExtension, - targetConfig: TargetConfig = TargetConfig(this), + targetConfig: TargetConfig = TargetConfig(this, extension), commonApiDump: TaskProvider? = null, commonApiCheck: TaskProvider? = null, useOutput: Boolean = false, @@ -221,7 +219,7 @@ private fun apiCheckEnabled(projectName: String, extension: ApiValidationExtensi private fun Project.configureApiTasks( extension: ApiValidationExtension, - targetConfig: TargetConfig = TargetConfig(this), + targetConfig: TargetConfig = TargetConfig(this, extension), ) { val projectName = project.name val apiBuildDir = targetConfig.apiDir.map { layout.buildDirectory.asFile.get().resolve(it) } From d415957b3d4c6f946d99a206caf2d2ec19122d9e Mon Sep 17 00:00:00 2001 From: Filipp Zhinkin Date: Tue, 16 Jan 2024 17:08:20 +0100 Subject: [PATCH 02/10] Disable output directories outside the project root --- .../validation/test/OutputDirectoryTests.kt | 22 +++++++++++++++++++ .../outputDirectory/outer.gradle.kts | 8 +++++++ src/main/kotlin/ApiValidationExtension.kt | 3 ++- .../BinaryCompatibilityValidatorPlugin.kt | 18 +++++++++++---- 4 files changed, 46 insertions(+), 5 deletions(-) create mode 100644 src/functionalTest/resources/examples/gradle/configuration/outputDirectory/outer.gradle.kts diff --git a/src/functionalTest/kotlin/kotlinx/validation/test/OutputDirectoryTests.kt b/src/functionalTest/kotlin/kotlinx/validation/test/OutputDirectoryTests.kt index bcfba33d..0597f9a9 100644 --- a/src/functionalTest/kotlin/kotlinx/validation/test/OutputDirectoryTests.kt +++ b/src/functionalTest/kotlin/kotlinx/validation/test/OutputDirectoryTests.kt @@ -135,4 +135,26 @@ class OutputDirectoryTests : BaseKotlinGradleTest() { assertTaskSuccess(":apiCheck") } } + + @Test + fun dumpIntoParentDirectory() { + val runner = test { + buildGradleKts { + resolve("/examples/gradle/base/withPlugin.gradle.kts") + resolve("/examples/gradle/configuration/outputDirectory/outer.gradle.kts") + } + + kotlin("AnotherBuildConfig.kt") { + resolve("/examples/classes/AnotherBuildConfig.kt") + } + + runner { + arguments.add(":apiDump") + } + } + + runner.buildAndFail().apply { + Assertions.assertThat(output).contains("apiDumpDirectory should be inside the project directory") + } + } } diff --git a/src/functionalTest/resources/examples/gradle/configuration/outputDirectory/outer.gradle.kts b/src/functionalTest/resources/examples/gradle/configuration/outputDirectory/outer.gradle.kts new file mode 100644 index 00000000..ccc5a0ed --- /dev/null +++ b/src/functionalTest/resources/examples/gradle/configuration/outputDirectory/outer.gradle.kts @@ -0,0 +1,8 @@ +/* + * Copyright 2016-2024 JetBrains s.r.o. + * Use of this source code is governed by the Apache 2.0 License that can be found in the LICENSE.txt file. + */ + +configure { + apiDumpDirectory = "../api" +} diff --git a/src/main/kotlin/ApiValidationExtension.kt b/src/main/kotlin/ApiValidationExtension.kt index b46b63b9..ed09ba42 100644 --- a/src/main/kotlin/ApiValidationExtension.kt +++ b/src/main/kotlin/ApiValidationExtension.kt @@ -67,7 +67,8 @@ public open class ApiValidationExtension { /** * A path to a directory containing an API dump. - * The path should be relative to the project's root directory and by default it's `api`. + * The path should be relative to the project's root directory and should resolve to its subdirectory. + * By default, it's `api`. */ public var apiDumpDirectory: String = "api" } diff --git a/src/main/kotlin/BinaryCompatibilityValidatorPlugin.kt b/src/main/kotlin/BinaryCompatibilityValidatorPlugin.kt index 38818d2e..07ba5cc1 100644 --- a/src/main/kotlin/BinaryCompatibilityValidatorPlugin.kt +++ b/src/main/kotlin/BinaryCompatibilityValidatorPlugin.kt @@ -138,7 +138,17 @@ private class TargetConfig constructor( val targetName: String? = null, private val dirConfig: Provider? = null, ) { - private val API_DIR_PROVIDER = project.provider { extension.apiDumpDirectory } + private val apiDirProvider = project.provider { + val dir = extension.apiDumpDirectory + + val root = project.layout.projectDirectory.asFile.toPath().toAbsolutePath() + val resolvedDir = root.resolve(dir).toAbsolutePath() + if (!resolvedDir.startsWith(root)) { + throw IllegalArgumentException("apiDumpDirectory should be inside the project directory") + } + + dir + } fun apiTaskName(suffix: String) = when (targetName) { null, "" -> "api$suffix" @@ -148,10 +158,10 @@ private class TargetConfig constructor( val apiDir get() = dirConfig?.map { dirConfig -> when (dirConfig) { - DirConfig.COMMON -> API_DIR_PROVIDER.get() - else -> "${API_DIR_PROVIDER.get()}/$targetName" + DirConfig.COMMON -> apiDirProvider.get() + else -> "${apiDirProvider.get()}/$targetName" } - } ?: API_DIR_PROVIDER + } ?: apiDirProvider } private enum class DirConfig { From 6a7808766ea3dfb4f0bf75430c07cfb143e62355 Mon Sep 17 00:00:00 2001 From: Filipp Zhinkin Date: Tue, 16 Jan 2024 17:26:28 +0100 Subject: [PATCH 03/10] Update README --- README.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/README.md b/README.md index 5d4d129e..8bb3693d 100644 --- a/README.md +++ b/README.md @@ -89,6 +89,11 @@ apiValidation { * Flag to programmatically disable compatibility validator */ validationDisabled = true + + /** + * A path to a subdirectory inside the project root directory, where dumps should be stored. + */ + apiDumpDirectory = "api" } ``` @@ -123,6 +128,11 @@ apiValidation { * Flag to programmatically disable compatibility validator */ validationDisabled = false + + /** + * A path to a subdirectory inside the project root directory, where dumps should be stored. + */ + apiDumpDirectory = "aux/validation" } ``` From 06dbd43abd7db5aa705e8431eb853693f8358948 Mon Sep 17 00:00:00 2001 From: Filipp Zhinkin Date: Tue, 16 Jan 2024 17:28:04 +0100 Subject: [PATCH 04/10] Update api dump --- api/binary-compatibility-validator.api | 2 ++ 1 file changed, 2 insertions(+) diff --git a/api/binary-compatibility-validator.api b/api/binary-compatibility-validator.api index 35148e73..f78331ac 100644 --- a/api/binary-compatibility-validator.api +++ b/api/binary-compatibility-validator.api @@ -1,6 +1,7 @@ public class kotlinx/validation/ApiValidationExtension { public fun ()V public final fun getAdditionalSourceSets ()Ljava/util/Set; + public final fun getApiDumpDirectory ()Ljava/lang/String; public final fun getIgnoredClasses ()Ljava/util/Set; public final fun getIgnoredPackages ()Ljava/util/Set; public final fun getIgnoredProjects ()Ljava/util/Set; @@ -10,6 +11,7 @@ public class kotlinx/validation/ApiValidationExtension { public final fun getPublicPackages ()Ljava/util/Set; public final fun getValidationDisabled ()Z public final fun setAdditionalSourceSets (Ljava/util/Set;)V + public final fun setApiDumpDirectory (Ljava/lang/String;)V public final fun setIgnoredClasses (Ljava/util/Set;)V public final fun setIgnoredPackages (Ljava/util/Set;)V public final fun setIgnoredProjects (Ljava/util/Set;)V From 4a89626e0f25c77b86e791b90e17f7a2dc442f33 Mon Sep 17 00:00:00 2001 From: Filipp Zhinkin Date: Tue, 16 Jan 2024 18:09:52 +0100 Subject: [PATCH 05/10] Fixed path normalization --- src/main/kotlin/BinaryCompatibilityValidatorPlugin.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/kotlin/BinaryCompatibilityValidatorPlugin.kt b/src/main/kotlin/BinaryCompatibilityValidatorPlugin.kt index 07ba5cc1..b99090fc 100644 --- a/src/main/kotlin/BinaryCompatibilityValidatorPlugin.kt +++ b/src/main/kotlin/BinaryCompatibilityValidatorPlugin.kt @@ -141,8 +141,8 @@ private class TargetConfig constructor( private val apiDirProvider = project.provider { val dir = extension.apiDumpDirectory - val root = project.layout.projectDirectory.asFile.toPath().toAbsolutePath() - val resolvedDir = root.resolve(dir).toAbsolutePath() + val root = project.layout.projectDirectory.asFile.toPath().toAbsolutePath().normalize() + val resolvedDir = root.resolve(dir).normalize() if (!resolvedDir.startsWith(root)) { throw IllegalArgumentException("apiDumpDirectory should be inside the project directory") } From 1a25f1d315f973ad55cde5f767bc66a4ff1e436c Mon Sep 17 00:00:00 2001 From: Filipp Zhinkin Date: Thu, 18 Jan 2024 18:09:14 +0100 Subject: [PATCH 06/10] Fixed typos Co-authored-by: Vsevolod Tolstopyatov --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 8bb3693d..9da72bf2 100644 --- a/README.md +++ b/README.md @@ -91,7 +91,7 @@ apiValidation { validationDisabled = true /** - * A path to a subdirectory inside the project root directory, where dumps should be stored. + * A path to a subdirectory inside the project root directory where dumps should be stored. */ apiDumpDirectory = "api" } @@ -130,7 +130,7 @@ apiValidation { validationDisabled = false /** - * A path to a subdirectory inside the project root directory, where dumps should be stored. + * A path to a subdirectory inside the project root directory where dumps should be stored. */ apiDumpDirectory = "aux/validation" } From b473530f602d0bf685fe48a92d0dddc3394943f9 Mon Sep 17 00:00:00 2001 From: Filipp Zhinkin Date: Thu, 18 Jan 2024 18:12:13 +0100 Subject: [PATCH 07/10] Improve exception message --- src/main/kotlin/BinaryCompatibilityValidatorPlugin.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/kotlin/BinaryCompatibilityValidatorPlugin.kt b/src/main/kotlin/BinaryCompatibilityValidatorPlugin.kt index b99090fc..686671ab 100644 --- a/src/main/kotlin/BinaryCompatibilityValidatorPlugin.kt +++ b/src/main/kotlin/BinaryCompatibilityValidatorPlugin.kt @@ -144,7 +144,8 @@ private class TargetConfig constructor( val root = project.layout.projectDirectory.asFile.toPath().toAbsolutePath().normalize() val resolvedDir = root.resolve(dir).normalize() if (!resolvedDir.startsWith(root)) { - throw IllegalArgumentException("apiDumpDirectory should be inside the project directory") + throw IllegalArgumentException("apiDumpDirectory (\"$dir\") should be inside the project directory, " + + "but it resolves to a path outside the project root.") } dir From 68c66cbb335662954e3ca6452cec8d07c15a1d90 Mon Sep 17 00:00:00 2001 From: Filipp Zhinkin Date: Thu, 18 Jan 2024 18:14:26 +0100 Subject: [PATCH 08/10] Include resolved paths into an error message --- src/main/kotlin/BinaryCompatibilityValidatorPlugin.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/kotlin/BinaryCompatibilityValidatorPlugin.kt b/src/main/kotlin/BinaryCompatibilityValidatorPlugin.kt index 686671ab..4de6c6cd 100644 --- a/src/main/kotlin/BinaryCompatibilityValidatorPlugin.kt +++ b/src/main/kotlin/BinaryCompatibilityValidatorPlugin.kt @@ -145,7 +145,8 @@ private class TargetConfig constructor( val resolvedDir = root.resolve(dir).normalize() if (!resolvedDir.startsWith(root)) { throw IllegalArgumentException("apiDumpDirectory (\"$dir\") should be inside the project directory, " + - "but it resolves to a path outside the project root.") + "but it resolves to a path outside the project root.\n" + + "Project's root path: $root\nResolved apiDumpDirectory: $resolvedDir") } dir From 2e465d79822bfaaca14a7d1350c2dcd2518af82b Mon Sep 17 00:00:00 2001 From: Filipp Zhinkin Date: Thu, 18 Jan 2024 18:20:02 +0100 Subject: [PATCH 09/10] Cleaned up the code --- .../BinaryCompatibilityValidatorPlugin.kt | 28 ++++++++++--------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/src/main/kotlin/BinaryCompatibilityValidatorPlugin.kt b/src/main/kotlin/BinaryCompatibilityValidatorPlugin.kt index 4de6c6cd..c117659f 100644 --- a/src/main/kotlin/BinaryCompatibilityValidatorPlugin.kt +++ b/src/main/kotlin/BinaryCompatibilityValidatorPlugin.kt @@ -136,7 +136,7 @@ private class TargetConfig constructor( project: Project, extension: ApiValidationExtension, val targetName: String? = null, - private val dirConfig: Provider? = null, + dirConfig: Provider? = null, ) { private val apiDirProvider = project.provider { val dir = extension.apiDumpDirectory @@ -144,26 +144,27 @@ private class TargetConfig constructor( val root = project.layout.projectDirectory.asFile.toPath().toAbsolutePath().normalize() val resolvedDir = root.resolve(dir).normalize() if (!resolvedDir.startsWith(root)) { - throw IllegalArgumentException("apiDumpDirectory (\"$dir\") should be inside the project directory, " + - "but it resolves to a path outside the project root.\n" + - "Project's root path: $root\nResolved apiDumpDirectory: $resolvedDir") + throw IllegalArgumentException( + "apiDumpDirectory (\"$dir\") should be inside the project directory, " + + "but it resolves to a path outside the project root.\n" + + "Project's root path: $root\nResolved apiDumpDirectory: $resolvedDir" + ) } dir } + val apiDir = dirConfig?.map { dirConfig -> + when (dirConfig) { + DirConfig.COMMON -> apiDirProvider.get() + else -> "${apiDirProvider.get()}/$targetName" + } + } ?: apiDirProvider + fun apiTaskName(suffix: String) = when (targetName) { null, "" -> "api$suffix" - else -> "${targetName}Api$suffix" + else -> "${targetName}Api$suffix" } - - val apiDir - get() = dirConfig?.map { dirConfig -> - when (dirConfig) { - DirConfig.COMMON -> apiDirProvider.get() - else -> "${apiDirProvider.get()}/$targetName" - } - } ?: apiDirProvider } private enum class DirConfig { @@ -172,6 +173,7 @@ private enum class DirConfig { * Used in single target projects */ COMMON, + /** * Target-based directory, used in multitarget setups. * E.g. for the project with targets jvm and android, From 9948793c05f197e1690cdb56f37c38f1e3b529b9 Mon Sep 17 00:00:00 2001 From: Filipp Zhinkin Date: Thu, 18 Jan 2024 18:20:51 +0100 Subject: [PATCH 10/10] Fixed test --- .../kotlin/kotlinx/validation/test/OutputDirectoryTests.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/functionalTest/kotlin/kotlinx/validation/test/OutputDirectoryTests.kt b/src/functionalTest/kotlin/kotlinx/validation/test/OutputDirectoryTests.kt index 0597f9a9..e15fdf9c 100644 --- a/src/functionalTest/kotlin/kotlinx/validation/test/OutputDirectoryTests.kt +++ b/src/functionalTest/kotlin/kotlinx/validation/test/OutputDirectoryTests.kt @@ -154,7 +154,7 @@ class OutputDirectoryTests : BaseKotlinGradleTest() { } runner.buildAndFail().apply { - Assertions.assertThat(output).contains("apiDumpDirectory should be inside the project directory") + Assertions.assertThat(output).contains("apiDumpDirectory (\"../api\") should be inside the project directory") } } }