Skip to content

Commit

Permalink
Partially apply recommendations for improving DSL
Browse files Browse the repository at this point in the history
The new DSL will allow to write chains like `kover.reports.total { ... }` instead of `kover { reports { total { ... } } }`.

However, the DomainObjectContainer for variants has not been implemented, because it will be necessary to rework the workflow with different types of variants, which is part of a larger reworking of the DSL.

PR #625
Resolves #600
  • Loading branch information
shanshin committed Jun 7, 2024
1 parent 87a8da8 commit 0f5de01
Show file tree
Hide file tree
Showing 20 changed files with 328 additions and 129 deletions.
19 changes: 19 additions & 0 deletions kover-gradle-plugin/api/kover-gradle-plugin.api
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ public abstract interface class kotlinx/kover/gradle/plugin/dsl/KoverBinaryTaskC
public abstract interface class kotlinx/kover/gradle/plugin/dsl/KoverCurrentProjectVariantsConfig : kotlinx/kover/gradle/plugin/dsl/KoverVariantConfig {
public abstract fun copyVariant (Ljava/lang/String;Ljava/lang/String;)V
public abstract fun createVariant (Ljava/lang/String;Lorg/gradle/api/Action;)V
public abstract fun getInstrumentation ()Lkotlinx/kover/gradle/plugin/dsl/KoverProjectInstrumentation;
public abstract fun instrumentation (Lorg/gradle/api/Action;)V
public abstract fun providedVariant (Ljava/lang/String;Lorg/gradle/api/Action;)V
public abstract fun totalVariant (Lorg/gradle/api/Action;)V
Expand Down Expand Up @@ -151,7 +152,10 @@ public abstract interface class kotlinx/kover/gradle/plugin/dsl/KoverProjectExte
public fun excludeJavaCode ()V
public fun excludeSourceSets (Lorg/gradle/api/Action;)V
public fun excludeTests (Lorg/gradle/api/Action;)V
public abstract fun getCurrentProject ()Lkotlinx/kover/gradle/plugin/dsl/KoverCurrentProjectVariantsConfig;
public abstract fun getJacocoVersion ()Lorg/gradle/api/provider/Property;
public abstract fun getMerge ()Lkotlinx/kover/gradle/plugin/dsl/KoverMergingConfig;
public abstract fun getReports ()Lkotlinx/kover/gradle/plugin/dsl/KoverReportsConfig;
public abstract fun getUseJacoco ()Lorg/gradle/api/provider/Property;
public abstract fun merge (Lorg/gradle/api/Action;)V
public abstract fun reports (Lorg/gradle/api/Action;)V
Expand All @@ -173,6 +177,9 @@ public abstract interface class kotlinx/kover/gradle/plugin/dsl/KoverReportFilte
public abstract fun classes (Lorg/gradle/api/provider/Provider;)V
public abstract fun classes ([Ljava/lang/String;)V
public abstract fun classes ([Lorg/gradle/api/provider/Provider;)V
public abstract fun getAnnotatedBy ()Lorg/gradle/api/provider/SetProperty;
public abstract fun getClasses ()Lorg/gradle/api/provider/SetProperty;
public abstract fun getInheritedFrom ()Lorg/gradle/api/provider/SetProperty;
public abstract fun getProjects ()Lorg/gradle/api/provider/SetProperty;
public abstract fun inheritedFrom ([Ljava/lang/String;)V
public abstract fun inheritedFrom ([Lorg/gradle/api/provider/Provider;)V
Expand All @@ -184,13 +191,21 @@ public abstract interface class kotlinx/kover/gradle/plugin/dsl/KoverReportFilte

public abstract interface class kotlinx/kover/gradle/plugin/dsl/KoverReportFiltersConfig {
public abstract fun excludes (Lorg/gradle/api/Action;)V
public abstract fun getExcludes ()Lkotlinx/kover/gradle/plugin/dsl/KoverReportFilter;
public abstract fun getIncludes ()Lkotlinx/kover/gradle/plugin/dsl/KoverReportFilter;
public abstract fun includes (Lorg/gradle/api/Action;)V
}

public abstract interface class kotlinx/kover/gradle/plugin/dsl/KoverReportSetConfig {
public abstract fun binary (Lorg/gradle/api/Action;)V
public abstract fun filters (Lorg/gradle/api/Action;)V
public abstract fun filtersAppend (Lorg/gradle/api/Action;)V
public abstract fun getBinary ()Lkotlinx/kover/gradle/plugin/dsl/KoverBinaryTaskConfig;
public abstract fun getFilters ()Lkotlinx/kover/gradle/plugin/dsl/KoverReportFiltersConfig;
public abstract fun getHtml ()Lkotlinx/kover/gradle/plugin/dsl/KoverHtmlTaskConfig;
public abstract fun getLog ()Lkotlinx/kover/gradle/plugin/dsl/KoverLogTaskConfig;
public abstract fun getVerify ()Lkotlinx/kover/gradle/plugin/dsl/KoverVerifyTaskConfig;
public abstract fun getXml ()Lkotlinx/kover/gradle/plugin/dsl/KoverXmlTaskConfig;
public abstract fun html (Lorg/gradle/api/Action;)V
public abstract fun log (Lorg/gradle/api/Action;)V
public fun mergeWith (Ljava/lang/String;)V
Expand All @@ -203,6 +218,9 @@ public abstract interface class kotlinx/kover/gradle/plugin/dsl/KoverReportsConf
public fun androidReports (Ljava/lang/String;Lorg/gradle/api/Action;)V
public fun defaults (Lorg/gradle/api/Action;)V
public abstract fun filters (Lorg/gradle/api/Action;)V
public abstract fun getFilters ()Lkotlinx/kover/gradle/plugin/dsl/KoverReportFiltersConfig;
public abstract fun getTotal ()Lkotlinx/kover/gradle/plugin/dsl/KoverReportSetConfig;
public abstract fun getVerify ()Lkotlinx/kover/gradle/plugin/dsl/KoverVerificationRulesConfig;
public abstract fun total (Lorg/gradle/api/Action;)V
public abstract fun variant (Ljava/lang/String;Lorg/gradle/api/Action;)V
public abstract fun verify (Lorg/gradle/api/Action;)V
Expand All @@ -214,6 +232,7 @@ public abstract interface class kotlinx/kover/gradle/plugin/dsl/KoverTestsExclus
}

public abstract interface class kotlinx/kover/gradle/plugin/dsl/KoverVariantConfig {
public abstract fun getSources ()Lkotlinx/kover/gradle/plugin/dsl/KoverVariantSources;
public abstract fun sources (Lorg/gradle/api/Action;)V
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -56,29 +56,21 @@ dependencies {
kover {
reports {
// filters for all report types of all build variants
filters {
excludes {
androidGeneratedClasses()
}
}
filters.excludes.androidGeneratedClasses()

variant("release") {
// verification only for 'release' build variant
verify {
rule {
minBound(50)
}
verify.rule {
minBound(50)
}

// filters for all report types only for 'release' build variant
filters {
excludes {
androidGeneratedClasses()
classes(
// excludes debug classes
"*.DebugUtil"
)
}
filters.excludes {
androidGeneratedClasses()
classes(
// excludes debug classes
"*.DebugUtil"
)
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -68,9 +68,7 @@ kover {
reports {
// filters for all report types of all build variants
filters {
excludes {
androidGeneratedClasses()
}
excludes.androidGeneratedClasses()
}

variant("release") {
Expand Down
26 changes: 10 additions & 16 deletions kover-gradle-plugin/examples/jvm/merged/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -11,23 +11,17 @@ dependencies {
kover(project(":subproject"))
}

kover {
reports {
filters {
excludes {
classes("kotlinx.kover.examples.merged.utils.*", "kotlinx.kover.examples.merged.subproject.utils.*")
}
includes {
classes("kotlinx.kover.examples.merged.*")
}
}
kover.reports {
filters {
excludes.classes("kotlinx.kover.examples.merged.utils.*", "kotlinx.kover.examples.merged.subproject.utils.*")
includes.classes("kotlinx.kover.examples.merged.*")
}

verify {
rule {
bound {
minValue.set(50)
maxValue.set(75)
}
verify {
rule {
bound {
minValue.set(50)
maxValue.set(75)
}
}
}
Expand Down
12 changes: 3 additions & 9 deletions kover-gradle-plugin/examples/jvm/single-kmp/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -13,12 +13,6 @@ dependencies {
commonTestImplementation(kotlin("test"))
}

kover {
reports {
verify {
rule {
minBound(50)
}
}
}
}
kover.reports.verify.rule {
minBound(50)
}
10 changes: 2 additions & 8 deletions kover-gradle-plugin/examples/jvm/single/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,6 @@ dependencies {
testImplementation(kotlin("test"))
}

kover {
reports {
verify {
rule {
minBound(50)
}
}
}
kover.reports.verify.rule {
minBound(50)
}
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,35 @@ internal class MergingTests {
}
}

@GeneratedTest
fun BuildConfigurator.testRootSubprojectsWithProperty() {
addProjectWithKover {
sourcesFrom("simple")
kover {
// merge with all subprojects
merge.subprojects()
}
}
addProjectWithKover(":one") {
sourcesFrom("one")
}
addProjectWithKover(":two") {
sourcesFrom("two")
}

run(":koverXmlReport") {
checkOutcome(":koverGenerateArtifact", "SUCCESS")
checkOutcome(":one:koverGenerateArtifact", "SUCCESS")
checkOutcome(":two:koverGenerateArtifact", "SUCCESS")

xmlReport {
classCounter("org.jetbrains.ExampleClass").assertCovered()
classCounter("org.jetbrains.one.OneClass").assertCovered()
classCounter("org.jetbrains.two.TwoClass").assertCovered()
}
}
}

@GeneratedTest
fun BuildConfigurator.testRootSubprojectsByPath() {
addProjectWithKover {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,9 +51,7 @@ internal class ReportAnnotationFilterTests {
classes("*ByName")
annotatedBy("org.jetbrains.Exclude")
}
includes {
annotatedBy("*.Include")
}
includes.annotatedBy("*.Include")
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,7 @@ plugins {
id("org.jetbrains.kotlinx.kover") version "0.7.0"
}

kover {
currentProject {
sources {
excludedSourceSets.add("extra")
}
}
}
kover.currentProject.sources.excludedSourceSets.add("extra")

sourceSets.create("extra")

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,18 +58,25 @@ internal fun KoverContext.finalizing(origins: AllVariantOrigins) {
jvmVariant?.let { variantArtifacts[JVM_VARIANT_NAME] = it }
androidVariants.forEach { variantArtifacts[it.variantName] = it }

val availableVariants = variantArtifacts.keys + projectExtension.currentProject.customVariants.keys
projectExtension.reports.byName.forEach { (requestedVariant, _) ->
if (requestedVariant !in availableVariants) {
throw KoverIllegalConfigException("It is not possible to configure the '$requestedVariant' variant because it does not exist")
}
}

val totalVariant =
TotalVariantArtifacts(project, toolProvider, koverBucketConfiguration, variantConfig(TOTAL_VARIANT_NAME), projectExtension)
variantArtifacts.values.forEach { totalVariant.mergeWith(it) }
totalReports.assign(totalVariant)

projectExtension.current.providedVariants.forEach { (name, _) ->
projectExtension.currentProject.providedVariants.forEach { (name, _) ->
if (name !in variantArtifacts) {
throw KoverIllegalConfigException("It is unacceptable to configure provided variant '$name', since there is no such variant in the project.\nAcceptable variants: ${variantArtifacts.keys}")
}
}

projectExtension.current.customVariants.forEach { (name, config) ->
projectExtension.currentProject.customVariants.forEach { (name, config) ->
if (name == JVM_VARIANT_NAME) {
throw KoverIllegalConfigException("It is unacceptable to create a custom reports variant '$JVM_VARIANT_NAME', because this name is reserved for JVM code")
}
Expand Down Expand Up @@ -108,7 +115,7 @@ internal fun KoverContext.finalizing(origins: AllVariantOrigins) {
).assign(customVariant)
}

projectExtension.current.variantsToCopy.forEach { (name, originVariantName) ->
projectExtension.currentProject.variantsToCopy.forEach { (name, originVariantName) ->
val originalVariant = variantArtifacts[originVariantName]
?: throw KoverIllegalConfigException("Cannot create a variant '$name': the original variant '$originVariantName' does not exist.")

Expand Down Expand Up @@ -136,16 +143,16 @@ internal fun KoverContext.finalizing(origins: AllVariantOrigins) {
}

projectExtension.reports.byName.forEach { (requestedVariant, _) ->
if (requestedVariant !in variantArtifacts && requestedVariant !in projectExtension.current.variantsToCopy) {
if (requestedVariant !in variantArtifacts && requestedVariant !in projectExtension.currentProject.variantsToCopy) {
throw KoverIllegalConfigException("It is not possible to configure the '$requestedVariant' variant because it does not exist")
}
}
}

private fun KoverContext.variantConfig(variantName: String): KoverVariantCreateConfigImpl {
return projectExtension.current.customVariants.getOrElse(variantName) {
val variantConfig = projectExtension.current.objects.newInstance<KoverVariantCreateConfigImpl>(variantName)
variantConfig.deriveFrom(projectExtension.current)
return projectExtension.currentProject.customVariants.getOrElse(variantName) {
val variantConfig = projectExtension.currentProject.objects.newInstance<KoverVariantCreateConfigImpl>(variantName)
variantConfig.deriveFrom(projectExtension.currentProject)
variantConfig
}
}
Expand All @@ -160,7 +167,7 @@ private fun JvmVariantOrigin.createVariant(
koverContext: KoverContext,
config: KoverVariantCreateConfigImpl,
): JvmVariantArtifacts {
tests.instrument(koverContext, koverContext.projectExtension.koverDisabled, koverContext.projectExtension.current)
tests.instrument(koverContext, koverContext.projectExtension.koverDisabled, koverContext.projectExtension.currentProject)
return JvmVariantArtifacts(
koverContext.project,
koverContext.toolProvider,
Expand All @@ -175,7 +182,7 @@ private fun AndroidVariantOrigin.createVariant(
koverContext: KoverContext,
config: KoverVariantCreateConfigImpl,
): AndroidVariantArtifacts {
tests.instrument(koverContext, koverContext.projectExtension.koverDisabled, koverContext.projectExtension.current)
tests.instrument(koverContext, koverContext.projectExtension.koverDisabled, koverContext.projectExtension.currentProject)
return AndroidVariantArtifacts(
koverContext.project,
buildVariant.buildVariant,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,15 +15,15 @@ import org.gradle.api.provider.SetProperty
import org.gradle.api.specs.Spec

internal fun KoverContext.prepareMerging() {
if (!projectExtension.isMerged) return
if (!projectExtension.merge.configured) return

val projects = selectProjects()
configSelectedProjects(projects)
}


private fun KoverContext.selectProjects(): List<Project> {
val result = linkedMapOf<String, Project>(project.path to project)
val result = linkedMapOf(project.path to project)

fun addProjectIfFiltered(project: Project, filters: List<Spec<Project>>) {
if (result.containsKey(project.path)) return
Expand Down Expand Up @@ -83,10 +83,10 @@ private fun KoverProjectExtensionImpl.configBeforeFinalize(targetProject: Projec
targetExtension.jacocoVersion.set(jacocoVersion)
}

merge.sourcesAction?.execute(targetExtension.current.sources.wrap(targetProject))
merge.instrumentationAction?.execute(targetExtension.current.instrumentation.wrap(targetProject))
merge.sourcesAction?.execute(targetExtension.currentProject.sources.wrap(targetProject))
merge.instrumentationAction?.execute(targetExtension.currentProject.instrumentation.wrap(targetProject))
merge.variantsAction.forEach { (variantName, action) ->
targetExtension.current.createVariant(variantName) {
targetExtension.currentProject.createVariant(variantName) {
action.execute(wrap(targetProject))
}
}
Expand All @@ -111,6 +111,7 @@ private fun KoverProjectInstrumentation.wrap(project: Project): KoverMergingInst
}
private fun KoverVariantCreateConfig.wrap(project: Project): KoverMergingVariantCreate {
return object : KoverMergingVariantCreate {
override val sources: KoverVariantSources = this@wrap.sources
override fun sources(block: Action<KoverVariantSources>) = this@wrap.sources(block)
override fun add(vararg variantNames: String, optional: Boolean) = this@wrap.add(*variantNames, optional = optional)
override fun addWithDependencies(vararg variantNames: String, optional: Boolean) = this@wrap.addWithDependencies(*variantNames, optional = optional)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -68,8 +68,8 @@ internal sealed class AbstractVariantArtifacts(
}

protected fun fromOrigin(origin: VariantOrigin, compilationFilter: (String) -> Boolean = { true }) {
val excludedTasks = projectExtension.current.instrumentation.disabledForTestTasks
val disabledInstrumentation = projectExtension.current.instrumentation.disabledForAll
val excludedTasks = projectExtension.currentProject.instrumentation.disabledForTestTasks
val disabledInstrumentation = projectExtension.currentProject.instrumentation.disabledForAll

val tests = origin.tests.matching {
!disabledInstrumentation.get()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -212,14 +212,14 @@ internal class VariantReportsSet(
private fun KoverReportFiltersConfigImpl.convert(): Provider<ReportFilters> {
return project.provider {
ReportFilters(
includesImpl.classes.get(),
includesImpl.annotations.get(),
includesImpl.inheritedFrom.get(),
includesImpl.projects.get(),
excludesImpl.classes.get(),
excludesImpl.annotations.get(),
excludesImpl.inheritedFrom.get(),
excludesImpl.projects.get()
includes.classes.get(),
includes.annotatedBy.get(),
includes.inheritedFrom.get(),
includes.projects.get(),
excludes.classes.get(),
excludes.annotatedBy.get(),
excludes.inheritedFrom.get(),
excludes.projects.get()
)
}
}
Expand Down
Loading

0 comments on commit 0f5de01

Please sign in to comment.