diff --git a/README.md b/README.md index e482d4b..d0dc75d 100644 --- a/README.md +++ b/README.md @@ -131,7 +131,7 @@ binaryCompatibilityValidator { } // BCV will automatically register a target for testFixtures, but it must be enabled manually - targets.named("testFixtures") { + targets.testFixtures { enabled.set(true) } diff --git a/build.gradle.kts b/build.gradle.kts index 84cda03..bb0209d 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -6,7 +6,7 @@ plugins { } group = "dev.adamko.kotlin.binary_compatibility_validator" -version = "0.0.5" +version = "0.1.0" idea { module { diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 037b15b..651c148 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -3,11 +3,11 @@ kotlinGradle = "1.6.0" javaDiffUtils = "4.12" -junit = "5.9.2" -kotest = "5.5.5" +junit = "5.9.3" +kotest = "5.6.1" kotlinx-bcv = "0.13.1" -gradlePluginPublishPlugin = "1.1.0" +gradlePluginPublishPlugin = "1.2.0" shadowPlugin = "8.1.0" bcvMu = "0.0.3" diff --git a/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/kotlin/kotlinx/validation/test/JavaTestFixturesTest.kt b/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/kotlin/kotlinx/validation/test/JavaTestFixturesTest.kt index ee1b56d..fb9cdb3 100644 --- a/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/kotlin/kotlinx/validation/test/JavaTestFixturesTest.kt +++ b/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/kotlin/kotlinx/validation/test/JavaTestFixturesTest.kt @@ -125,12 +125,12 @@ private fun FunSpec.createTestFixturesProject( buildGradleKts = """ |plugins { | kotlin("jvm") version "1.7.10" - | id("dev.adamko.kotlin.binary-compatibility-validator") version "0.0.5" + | id("dev.adamko.kotlin.binary-compatibility-validator") version "0.0.6-SNAPSHOT" | `java-test-fixtures` |} | |binaryCompatibilityValidator { - | testFixtures { + | targets.testFixtures { | enabled.set($bcvTestFixturesTargetEnabled) | } |} diff --git a/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/kotlin/kotlinx/validation/test/SettingsPluginDslTest.kt b/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/kotlin/kotlinx/validation/test/SettingsPluginDslTest.kt index 851860e..95b6883 100644 --- a/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/kotlin/kotlinx/validation/test/SettingsPluginDslTest.kt +++ b/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/kotlin/kotlinx/validation/test/SettingsPluginDslTest.kt @@ -154,7 +154,7 @@ buildscript { plugins { - id("dev.adamko.kotlin.binary-compatibility-validator") version "0.0.5" + id("dev.adamko.kotlin.binary-compatibility-validator") version "0.0.6-SNAPSHOT" } include( diff --git a/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/resources/examples/gradle/base/androidJavaLibrary.gradle.kts b/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/resources/examples/gradle/base/androidJavaLibrary.gradle.kts index 6c186a5..3f9c498 100644 --- a/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/resources/examples/gradle/base/androidJavaLibrary.gradle.kts +++ b/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/resources/examples/gradle/base/androidJavaLibrary.gradle.kts @@ -1,6 +1,6 @@ plugins { id("com.android.library") - id("dev.adamko.kotlin.binary-compatibility-validator") version "0.0.5" + id("dev.adamko.kotlin.binary-compatibility-validator") version "0.0.6-SNAPSHOT" } android { diff --git a/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/resources/examples/gradle/base/androidKotlinLibrary.gradle.kts b/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/resources/examples/gradle/base/androidKotlinLibrary.gradle.kts index 611b722..d84c09d 100644 --- a/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/resources/examples/gradle/base/androidKotlinLibrary.gradle.kts +++ b/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/resources/examples/gradle/base/androidKotlinLibrary.gradle.kts @@ -1,7 +1,7 @@ plugins { id("com.android.library") id("kotlin-android") - id("dev.adamko.kotlin.binary-compatibility-validator") version "0.0.5" + id("dev.adamko.kotlin.binary-compatibility-validator") version "0.0.6-SNAPSHOT" } android { diff --git a/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/resources/examples/gradle/base/androidProjectRoot.gradle.kts b/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/resources/examples/gradle/base/androidProjectRoot.gradle.kts index 463a1ee..9114dd9 100644 --- a/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/resources/examples/gradle/base/androidProjectRoot.gradle.kts +++ b/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/resources/examples/gradle/base/androidProjectRoot.gradle.kts @@ -2,7 +2,7 @@ plugins { id("com.android.application").version("7.2.2").apply(false) id("com.android.library").version("7.2.2").apply(false) id("org.jetbrains.kotlin.android").version("1.7.10").apply(false) - id("dev.adamko.kotlin.binary-compatibility-validator") version "0.0.5" apply false + id("dev.adamko.kotlin.binary-compatibility-validator") version "0.0.6-SNAPSHOT" apply false } tasks.register("clean", Delete::class) { diff --git a/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/resources/examples/gradle/base/multiplatformWithJvmTargets.gradle.kts b/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/resources/examples/gradle/base/multiplatformWithJvmTargets.gradle.kts index 359c186..640c00e 100644 --- a/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/resources/examples/gradle/base/multiplatformWithJvmTargets.gradle.kts +++ b/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/resources/examples/gradle/base/multiplatformWithJvmTargets.gradle.kts @@ -1,6 +1,6 @@ plugins { kotlin("multiplatform") version "1.5.20" - id("dev.adamko.kotlin.binary-compatibility-validator") version "0.0.5" + id("dev.adamko.kotlin.binary-compatibility-validator") version "0.0.6-SNAPSHOT" } kotlin { diff --git a/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/resources/examples/gradle/base/multiplatformWithSingleJvmTarget.gradle.kts b/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/resources/examples/gradle/base/multiplatformWithSingleJvmTarget.gradle.kts index 6af93c2..2527abc 100644 --- a/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/resources/examples/gradle/base/multiplatformWithSingleJvmTarget.gradle.kts +++ b/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/resources/examples/gradle/base/multiplatformWithSingleJvmTarget.gradle.kts @@ -1,6 +1,6 @@ plugins { kotlin("multiplatform") version "1.7.20" - id("dev.adamko.kotlin.binary-compatibility-validator") version "0.0.5" + id("dev.adamko.kotlin.binary-compatibility-validator") version "0.0.6-SNAPSHOT" } kotlin { diff --git a/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/resources/examples/gradle/base/withPlugin-noKotlinVersion.gradle.kts b/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/resources/examples/gradle/base/withPlugin-noKotlinVersion.gradle.kts index a7af066..7997e4a 100644 --- a/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/resources/examples/gradle/base/withPlugin-noKotlinVersion.gradle.kts +++ b/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/resources/examples/gradle/base/withPlugin-noKotlinVersion.gradle.kts @@ -1,6 +1,6 @@ plugins { kotlin("jvm") - id("dev.adamko.kotlin.binary-compatibility-validator") version "0.0.5" + id("dev.adamko.kotlin.binary-compatibility-validator") version "0.0.6-SNAPSHOT" } dependencies { diff --git a/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/resources/examples/gradle/base/withPlugin.gradle.kts b/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/resources/examples/gradle/base/withPlugin.gradle.kts index 87fb43d..b4ce1fa 100644 --- a/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/resources/examples/gradle/base/withPlugin.gradle.kts +++ b/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/resources/examples/gradle/base/withPlugin.gradle.kts @@ -1,4 +1,4 @@ plugins { kotlin("jvm") version "1.7.20" - id("dev.adamko.kotlin.binary-compatibility-validator") version "0.0.5" + id("dev.adamko.kotlin.binary-compatibility-validator") version "0.0.6-SNAPSHOT" } diff --git a/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/resources/examples/gradle/configuration/jarAsInput/inputJar.gradle.kts b/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/resources/examples/gradle/configuration/jarAsInput/inputJar.gradle.kts index b8a1585..d894a22 100644 --- a/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/resources/examples/gradle/configuration/jarAsInput/inputJar.gradle.kts +++ b/modules/bcv-gradle-plugin-functional-tests/src/functionalTest/resources/examples/gradle/configuration/jarAsInput/inputJar.gradle.kts @@ -4,7 +4,7 @@ tasks.jar { } binaryCompatibilityValidator { - kotlinJvm { + targets.kotlinJvm { inputJar.set(tasks.jar.flatMap { it.archiveFile }) } } diff --git a/modules/bcv-gradle-plugin-functional-tests/src/functionalTest2/kotlin/DefaultConfigTests.kt b/modules/bcv-gradle-plugin-functional-tests/src/functionalTest2/kotlin/DefaultConfigTests.kt index 0259854..18f8e96 100644 --- a/modules/bcv-gradle-plugin-functional-tests/src/functionalTest2/kotlin/DefaultConfigTests.kt +++ b/modules/bcv-gradle-plugin-functional-tests/src/functionalTest2/kotlin/DefaultConfigTests.kt @@ -23,7 +23,7 @@ internal class DefaultConfigTests : FunSpec({ buildGradleKts += """ |plugins { | kotlin("jvm") version "1.7.20" - | id("dev.adamko.kotlin.binary-compatibility-validator") version "0.0.5" + | id("dev.adamko.kotlin.binary-compatibility-validator") version "0.0.6-SNAPSHOT" |} | """.trimMargin() diff --git a/modules/bcv-gradle-plugin/api/bcv-gradle-plugin.api b/modules/bcv-gradle-plugin/api/bcv-gradle-plugin.api index a8d194e..fce1d78 100644 --- a/modules/bcv-gradle-plugin/api/bcv-gradle-plugin.api +++ b/modules/bcv-gradle-plugin/api/bcv-gradle-plugin.api @@ -11,7 +11,7 @@ public abstract class dev/adamko/kotlin/binary_compatibility_validator/BCVPlugin public final class dev/adamko/kotlin/binary_compatibility_validator/BCVPlugin$Companion { } -public abstract interface class dev/adamko/kotlin/binary_compatibility_validator/BCVProjectExtension : dev/adamko/kotlin/binary_compatibility_validator/targets/BCVTargetSpec, org/gradle/api/plugins/ExtensionAware { +public abstract class dev/adamko/kotlin/binary_compatibility_validator/BCVProjectExtension : dev/adamko/kotlin/binary_compatibility_validator/targets/BCVTargetSpec, org/gradle/api/plugins/ExtensionAware { public abstract fun getEnabled ()Lorg/gradle/api/provider/Property; public abstract fun getIgnoredClasses ()Lorg/gradle/api/provider/SetProperty; public abstract fun getIgnoredMarkers ()Lorg/gradle/api/provider/SetProperty; @@ -23,7 +23,7 @@ public abstract interface class dev/adamko/kotlin/binary_compatibility_validator public abstract fun getPublicClasses ()Lorg/gradle/api/provider/SetProperty; public abstract fun getPublicMarkers ()Lorg/gradle/api/provider/SetProperty; public abstract fun getPublicPackages ()Lorg/gradle/api/provider/SetProperty; - public abstract fun getTargets ()Lorg/gradle/api/NamedDomainObjectContainer; + public final fun getTargets ()Lorg/gradle/api/NamedDomainObjectContainer; } public abstract class dev/adamko/kotlin/binary_compatibility_validator/BCVProjectPlugin : org/gradle/api/Plugin { @@ -94,7 +94,7 @@ public abstract class dev/adamko/kotlin/binary_compatibility_validator/tasks/BCV public abstract fun getOutputApiBuildDir ()Lorg/gradle/api/file/DirectoryProperty; public abstract fun getProjectName ()Lorg/gradle/api/provider/Property; public abstract fun getRuntimeClasspath ()Lorg/gradle/api/file/ConfigurableFileCollection; - public abstract fun getTargets ()Lorg/gradle/api/NamedDomainObjectContainer; + public final fun getTargets ()Lorg/gradle/api/NamedDomainObjectContainer; } public abstract class dev/adamko/kotlin/binary_compatibility_validator/tasks/BCVDefaultTask : org/gradle/api/DefaultTask { diff --git a/modules/bcv-gradle-plugin/src/main/kotlin/BCVProjectExtension.kt b/modules/bcv-gradle-plugin/src/main/kotlin/BCVProjectExtension.kt index 264891e..bbbe293 100644 --- a/modules/bcv-gradle-plugin/src/main/kotlin/BCVProjectExtension.kt +++ b/modules/bcv-gradle-plugin/src/main/kotlin/BCVProjectExtension.kt @@ -1,51 +1,62 @@ package dev.adamko.kotlin.binary_compatibility_validator +import dev.adamko.kotlin.binary_compatibility_validator.internal.BCVInternalApi +import dev.adamko.kotlin.binary_compatibility_validator.internal.adding +import dev.adamko.kotlin.binary_compatibility_validator.internal.domainObjectContainer import dev.adamko.kotlin.binary_compatibility_validator.targets.BCVTarget import dev.adamko.kotlin.binary_compatibility_validator.targets.BCVTargetSpec +import javax.inject.Inject import org.gradle.api.NamedDomainObjectContainer import org.gradle.api.file.DirectoryProperty +import org.gradle.api.model.ObjectFactory import org.gradle.api.model.ReplacedBy import org.gradle.api.plugins.ExtensionAware import org.gradle.api.provider.Property import org.gradle.api.provider.SetProperty -interface BCVProjectExtension : BCVTargetSpec, ExtensionAware { +abstract class BCVProjectExtension +@BCVInternalApi +@Inject +constructor( + private val objects: ObjectFactory +) : BCVTargetSpec, ExtensionAware { /** Sets the default [BCVTarget.enabled] value for all [targets]. */ - override val enabled: Property + abstract override val enabled: Property /** Sets the default [BCVTarget.ignoredPackages] value for all [targets]. */ - override val ignoredPackages: SetProperty + abstract override val ignoredPackages: SetProperty /** Sets the default [BCVTarget.publicMarkers] for all [targets] */ - override val publicMarkers: SetProperty + abstract override val publicMarkers: SetProperty /** Sets the default [BCVTarget.publicPackages] for all [targets] */ - override val publicPackages: SetProperty + abstract override val publicPackages: SetProperty /** Sets the default [BCVTarget.publicClasses] for all [targets] */ - override val publicClasses: SetProperty + abstract override val publicClasses: SetProperty /** Sets the default [BCVTarget.ignoredMarkers] value for all [targets]. */ - override val ignoredMarkers: SetProperty + abstract override val ignoredMarkers: SetProperty @get:ReplacedBy("ignoredMarkers") @Deprecated("renamed to ignoredMarkers", ReplaceWith("ignoredMarkers")) - val nonPublicMarkers: SetProperty + abstract val nonPublicMarkers: SetProperty /** Sets the default [BCVTarget.ignoredClasses] value for all [targets]. */ - override val ignoredClasses: SetProperty + abstract override val ignoredClasses: SetProperty /** * The directory that contains the API declarations. * * Defaults to [BCVPlugin.API_DIR]. */ - val outputApiDir: DirectoryProperty + abstract val outputApiDir: DirectoryProperty - val projectName: Property + abstract val projectName: Property - val kotlinxBinaryCompatibilityValidatorVersion: Property + abstract val kotlinxBinaryCompatibilityValidatorVersion: Property - val targets: NamedDomainObjectContainer + val targets: NamedDomainObjectContainer = + extensions.adding("targets") { objects.domainObjectContainer() } } diff --git a/modules/bcv-gradle-plugin/src/main/kotlin/BCVProjectPlugin.kt b/modules/bcv-gradle-plugin/src/main/kotlin/BCVProjectPlugin.kt index a9d1aaf..79cceee 100644 --- a/modules/bcv-gradle-plugin/src/main/kotlin/BCVProjectPlugin.kt +++ b/modules/bcv-gradle-plugin/src/main/kotlin/BCVProjectPlugin.kt @@ -119,10 +119,6 @@ constructor( ignoredPackages.convention(extension.ignoredPackages) } - extension.targets.all { - extension.extensions.add(platformType, this) - } - return extension } diff --git a/modules/bcv-gradle-plugin/src/main/kotlin/internal/gradleUtils.kt b/modules/bcv-gradle-plugin/src/main/kotlin/internal/gradleUtils.kt new file mode 100644 index 0000000..11c1b97 --- /dev/null +++ b/modules/bcv-gradle-plugin/src/main/kotlin/internal/gradleUtils.kt @@ -0,0 +1,48 @@ +package dev.adamko.kotlin.binary_compatibility_validator.internal + +import org.gradle.api.NamedDomainObjectContainer +import org.gradle.api.NamedDomainObjectFactory +import org.gradle.api.model.ObjectFactory +import org.gradle.api.plugins.ExtensionContainer +import org.gradle.kotlin.dsl.* + + +/** + * Create a new [NamedDomainObjectContainer], using + * [org.gradle.kotlin.dsl.domainObjectContainer] + * (but [T] is `reified`). + * + * @param[factory] an optional factory for creating elements + * @see org.gradle.kotlin.dsl.domainObjectContainer + */ +internal inline fun ObjectFactory.domainObjectContainer( + factory: NamedDomainObjectFactory? = null +): NamedDomainObjectContainer = + if (factory == null) { + domainObjectContainer(T::class) + } else { + domainObjectContainer(T::class, factory) + } + + +/** + * [Add][ExtensionContainer.add] a value (from [valueProvider]) with [name], and return the value. + * + * Adding an extension is especially useful for improving the DSL in build scripts when [T] is a + * [NamedDomainObjectContainer]. + * Using an extension will allow Gradle to generate + * [type-safe model accessors](https://docs.gradle.org/current/userguide/kotlin_dsl.html#kotdsl:accessor_applicability) + * for added types. + * + * ([name] should match the property name. This has to be done manually because using a + * delegated-property provider means Gradle can't introspect the types properly, so it fails to + * create accessors). + */ +internal inline fun ExtensionContainer.adding( + name: String, + crossinline valueProvider: () -> T, +): T { + val value: T = valueProvider() + add(name, value) + return value +} diff --git a/modules/bcv-gradle-plugin/src/main/kotlin/tasks/BCVApiGenerateTask.kt b/modules/bcv-gradle-plugin/src/main/kotlin/tasks/BCVApiGenerateTask.kt index f2924a5..57fe878 100644 --- a/modules/bcv-gradle-plugin/src/main/kotlin/tasks/BCVApiGenerateTask.kt +++ b/modules/bcv-gradle-plugin/src/main/kotlin/tasks/BCVApiGenerateTask.kt @@ -1,6 +1,8 @@ package dev.adamko.kotlin.binary_compatibility_validator.tasks import dev.adamko.kotlin.binary_compatibility_validator.internal.BCVInternalApi +import dev.adamko.kotlin.binary_compatibility_validator.internal.adding +import dev.adamko.kotlin.binary_compatibility_validator.internal.domainObjectContainer import dev.adamko.kotlin.binary_compatibility_validator.targets.BCVTarget import dev.adamko.kotlin.binary_compatibility_validator.workers.BCVSignaturesWorker import java.io.* @@ -8,6 +10,7 @@ import javax.inject.Inject import kotlinx.validation.api.* import org.gradle.api.* import org.gradle.api.file.* +import org.gradle.api.model.ObjectFactory import org.gradle.api.provider.Property import org.gradle.api.tasks.* import org.gradle.kotlin.dsl.* @@ -21,10 +24,12 @@ abstract class BCVApiGenerateTask constructor( private val workers: WorkerExecutor, private val fs: FileSystemOperations, + private val objects: ObjectFactory, ) : BCVDefaultTask() { @get:Nested - abstract val targets: NamedDomainObjectContainer + val targets: NamedDomainObjectContainer = + extensions.adding("targets") { objects.domainObjectContainer() } @get:InputFiles @get:PathSensitive(PathSensitivity.RELATIVE)