Skip to content

Commit 0f5de01

Browse files
authored
Partially apply recommendations for improving DSL
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
1 parent 87a8da8 commit 0f5de01

File tree

20 files changed

+328
-129
lines changed

20 files changed

+328
-129
lines changed

Diff for: kover-gradle-plugin/api/kover-gradle-plugin.api

+19
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ public abstract interface class kotlinx/kover/gradle/plugin/dsl/KoverBinaryTaskC
4444
public abstract interface class kotlinx/kover/gradle/plugin/dsl/KoverCurrentProjectVariantsConfig : kotlinx/kover/gradle/plugin/dsl/KoverVariantConfig {
4545
public abstract fun copyVariant (Ljava/lang/String;Ljava/lang/String;)V
4646
public abstract fun createVariant (Ljava/lang/String;Lorg/gradle/api/Action;)V
47+
public abstract fun getInstrumentation ()Lkotlinx/kover/gradle/plugin/dsl/KoverProjectInstrumentation;
4748
public abstract fun instrumentation (Lorg/gradle/api/Action;)V
4849
public abstract fun providedVariant (Ljava/lang/String;Lorg/gradle/api/Action;)V
4950
public abstract fun totalVariant (Lorg/gradle/api/Action;)V
@@ -151,7 +152,10 @@ public abstract interface class kotlinx/kover/gradle/plugin/dsl/KoverProjectExte
151152
public fun excludeJavaCode ()V
152153
public fun excludeSourceSets (Lorg/gradle/api/Action;)V
153154
public fun excludeTests (Lorg/gradle/api/Action;)V
155+
public abstract fun getCurrentProject ()Lkotlinx/kover/gradle/plugin/dsl/KoverCurrentProjectVariantsConfig;
154156
public abstract fun getJacocoVersion ()Lorg/gradle/api/provider/Property;
157+
public abstract fun getMerge ()Lkotlinx/kover/gradle/plugin/dsl/KoverMergingConfig;
158+
public abstract fun getReports ()Lkotlinx/kover/gradle/plugin/dsl/KoverReportsConfig;
155159
public abstract fun getUseJacoco ()Lorg/gradle/api/provider/Property;
156160
public abstract fun merge (Lorg/gradle/api/Action;)V
157161
public abstract fun reports (Lorg/gradle/api/Action;)V
@@ -173,6 +177,9 @@ public abstract interface class kotlinx/kover/gradle/plugin/dsl/KoverReportFilte
173177
public abstract fun classes (Lorg/gradle/api/provider/Provider;)V
174178
public abstract fun classes ([Ljava/lang/String;)V
175179
public abstract fun classes ([Lorg/gradle/api/provider/Provider;)V
180+
public abstract fun getAnnotatedBy ()Lorg/gradle/api/provider/SetProperty;
181+
public abstract fun getClasses ()Lorg/gradle/api/provider/SetProperty;
182+
public abstract fun getInheritedFrom ()Lorg/gradle/api/provider/SetProperty;
176183
public abstract fun getProjects ()Lorg/gradle/api/provider/SetProperty;
177184
public abstract fun inheritedFrom ([Ljava/lang/String;)V
178185
public abstract fun inheritedFrom ([Lorg/gradle/api/provider/Provider;)V
@@ -184,13 +191,21 @@ public abstract interface class kotlinx/kover/gradle/plugin/dsl/KoverReportFilte
184191

185192
public abstract interface class kotlinx/kover/gradle/plugin/dsl/KoverReportFiltersConfig {
186193
public abstract fun excludes (Lorg/gradle/api/Action;)V
194+
public abstract fun getExcludes ()Lkotlinx/kover/gradle/plugin/dsl/KoverReportFilter;
195+
public abstract fun getIncludes ()Lkotlinx/kover/gradle/plugin/dsl/KoverReportFilter;
187196
public abstract fun includes (Lorg/gradle/api/Action;)V
188197
}
189198

190199
public abstract interface class kotlinx/kover/gradle/plugin/dsl/KoverReportSetConfig {
191200
public abstract fun binary (Lorg/gradle/api/Action;)V
192201
public abstract fun filters (Lorg/gradle/api/Action;)V
193202
public abstract fun filtersAppend (Lorg/gradle/api/Action;)V
203+
public abstract fun getBinary ()Lkotlinx/kover/gradle/plugin/dsl/KoverBinaryTaskConfig;
204+
public abstract fun getFilters ()Lkotlinx/kover/gradle/plugin/dsl/KoverReportFiltersConfig;
205+
public abstract fun getHtml ()Lkotlinx/kover/gradle/plugin/dsl/KoverHtmlTaskConfig;
206+
public abstract fun getLog ()Lkotlinx/kover/gradle/plugin/dsl/KoverLogTaskConfig;
207+
public abstract fun getVerify ()Lkotlinx/kover/gradle/plugin/dsl/KoverVerifyTaskConfig;
208+
public abstract fun getXml ()Lkotlinx/kover/gradle/plugin/dsl/KoverXmlTaskConfig;
194209
public abstract fun html (Lorg/gradle/api/Action;)V
195210
public abstract fun log (Lorg/gradle/api/Action;)V
196211
public fun mergeWith (Ljava/lang/String;)V
@@ -203,6 +218,9 @@ public abstract interface class kotlinx/kover/gradle/plugin/dsl/KoverReportsConf
203218
public fun androidReports (Ljava/lang/String;Lorg/gradle/api/Action;)V
204219
public fun defaults (Lorg/gradle/api/Action;)V
205220
public abstract fun filters (Lorg/gradle/api/Action;)V
221+
public abstract fun getFilters ()Lkotlinx/kover/gradle/plugin/dsl/KoverReportFiltersConfig;
222+
public abstract fun getTotal ()Lkotlinx/kover/gradle/plugin/dsl/KoverReportSetConfig;
223+
public abstract fun getVerify ()Lkotlinx/kover/gradle/plugin/dsl/KoverVerificationRulesConfig;
206224
public abstract fun total (Lorg/gradle/api/Action;)V
207225
public abstract fun variant (Ljava/lang/String;Lorg/gradle/api/Action;)V
208226
public abstract fun verify (Lorg/gradle/api/Action;)V
@@ -214,6 +232,7 @@ public abstract interface class kotlinx/kover/gradle/plugin/dsl/KoverTestsExclus
214232
}
215233

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

Diff for: kover-gradle-plugin/examples/android/multiproject/app/build.gradle.kts

+9-17
Original file line numberDiff line numberDiff line change
@@ -56,29 +56,21 @@ dependencies {
5656
kover {
5757
reports {
5858
// filters for all report types of all build variants
59-
filters {
60-
excludes {
61-
androidGeneratedClasses()
62-
}
63-
}
59+
filters.excludes.androidGeneratedClasses()
6460

6561
variant("release") {
6662
// verification only for 'release' build variant
67-
verify {
68-
rule {
69-
minBound(50)
70-
}
63+
verify.rule {
64+
minBound(50)
7165
}
7266

7367
// filters for all report types only for 'release' build variant
74-
filters {
75-
excludes {
76-
androidGeneratedClasses()
77-
classes(
78-
// excludes debug classes
79-
"*.DebugUtil"
80-
)
81-
}
68+
filters.excludes {
69+
androidGeneratedClasses()
70+
classes(
71+
// excludes debug classes
72+
"*.DebugUtil"
73+
)
8274
}
8375
}
8476

Diff for: kover-gradle-plugin/examples/android/variantUsage/app/build.gradle.kts

+1-3
Original file line numberDiff line numberDiff line change
@@ -68,9 +68,7 @@ kover {
6868
reports {
6969
// filters for all report types of all build variants
7070
filters {
71-
excludes {
72-
androidGeneratedClasses()
73-
}
71+
excludes.androidGeneratedClasses()
7472
}
7573

7674
variant("release") {

Diff for: kover-gradle-plugin/examples/jvm/merged/build.gradle.kts

+10-16
Original file line numberDiff line numberDiff line change
@@ -11,23 +11,17 @@ dependencies {
1111
kover(project(":subproject"))
1212
}
1313

14-
kover {
15-
reports {
16-
filters {
17-
excludes {
18-
classes("kotlinx.kover.examples.merged.utils.*", "kotlinx.kover.examples.merged.subproject.utils.*")
19-
}
20-
includes {
21-
classes("kotlinx.kover.examples.merged.*")
22-
}
23-
}
14+
kover.reports {
15+
filters {
16+
excludes.classes("kotlinx.kover.examples.merged.utils.*", "kotlinx.kover.examples.merged.subproject.utils.*")
17+
includes.classes("kotlinx.kover.examples.merged.*")
18+
}
2419

25-
verify {
26-
rule {
27-
bound {
28-
minValue.set(50)
29-
maxValue.set(75)
30-
}
20+
verify {
21+
rule {
22+
bound {
23+
minValue.set(50)
24+
maxValue.set(75)
3125
}
3226
}
3327
}

Diff for: kover-gradle-plugin/examples/jvm/single-kmp/build.gradle.kts

+3-9
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,6 @@ dependencies {
1313
commonTestImplementation(kotlin("test"))
1414
}
1515

16-
kover {
17-
reports {
18-
verify {
19-
rule {
20-
minBound(50)
21-
}
22-
}
23-
}
24-
}
16+
kover.reports.verify.rule {
17+
minBound(50)
18+
}

Diff for: kover-gradle-plugin/examples/jvm/single/build.gradle.kts

+2-8
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,6 @@ dependencies {
77
testImplementation(kotlin("test"))
88
}
99

10-
kover {
11-
reports {
12-
verify {
13-
rule {
14-
minBound(50)
15-
}
16-
}
17-
}
10+
kover.reports.verify.rule {
11+
minBound(50)
1812
}

Diff for: kover-gradle-plugin/src/functionalTest/kotlin/kotlinx/kover/gradle/plugin/test/functional/cases/MergingTests.kt

+29
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,35 @@ internal class MergingTests {
6161
}
6262
}
6363

64+
@GeneratedTest
65+
fun BuildConfigurator.testRootSubprojectsWithProperty() {
66+
addProjectWithKover {
67+
sourcesFrom("simple")
68+
kover {
69+
// merge with all subprojects
70+
merge.subprojects()
71+
}
72+
}
73+
addProjectWithKover(":one") {
74+
sourcesFrom("one")
75+
}
76+
addProjectWithKover(":two") {
77+
sourcesFrom("two")
78+
}
79+
80+
run(":koverXmlReport") {
81+
checkOutcome(":koverGenerateArtifact", "SUCCESS")
82+
checkOutcome(":one:koverGenerateArtifact", "SUCCESS")
83+
checkOutcome(":two:koverGenerateArtifact", "SUCCESS")
84+
85+
xmlReport {
86+
classCounter("org.jetbrains.ExampleClass").assertCovered()
87+
classCounter("org.jetbrains.one.OneClass").assertCovered()
88+
classCounter("org.jetbrains.two.TwoClass").assertCovered()
89+
}
90+
}
91+
}
92+
6493
@GeneratedTest
6594
fun BuildConfigurator.testRootSubprojectsByPath() {
6695
addProjectWithKover {

Diff for: kover-gradle-plugin/src/functionalTest/kotlin/kotlinx/kover/gradle/plugin/test/functional/cases/ReportAnnotationFilterTests.kt

+1-3
Original file line numberDiff line numberDiff line change
@@ -51,9 +51,7 @@ internal class ReportAnnotationFilterTests {
5151
classes("*ByName")
5252
annotatedBy("org.jetbrains.Exclude")
5353
}
54-
includes {
55-
annotatedBy("*.Include")
56-
}
54+
includes.annotatedBy("*.Include")
5755
}
5856
}
5957
}

Diff for: kover-gradle-plugin/src/functionalTest/templates/builds/sourcesets-mpp/build.gradle.kts

+1-7
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,7 @@ plugins {
33
id("org.jetbrains.kotlinx.kover") version "0.7.0"
44
}
55

6-
kover {
7-
currentProject {
8-
sources {
9-
excludedSourceSets.add("extra")
10-
}
11-
}
12-
}
6+
kover.currentProject.sources.excludedSourceSets.add("extra")
137

148
sourceSets.create("extra")
159

Diff for: kover-gradle-plugin/src/main/kotlin/kotlinx/kover/gradle/plugin/appliers/FinalizeKover.kt

+16-9
Original file line numberDiff line numberDiff line change
@@ -58,18 +58,25 @@ internal fun KoverContext.finalizing(origins: AllVariantOrigins) {
5858
jvmVariant?.let { variantArtifacts[JVM_VARIANT_NAME] = it }
5959
androidVariants.forEach { variantArtifacts[it.variantName] = it }
6060

61+
val availableVariants = variantArtifacts.keys + projectExtension.currentProject.customVariants.keys
62+
projectExtension.reports.byName.forEach { (requestedVariant, _) ->
63+
if (requestedVariant !in availableVariants) {
64+
throw KoverIllegalConfigException("It is not possible to configure the '$requestedVariant' variant because it does not exist")
65+
}
66+
}
67+
6168
val totalVariant =
6269
TotalVariantArtifacts(project, toolProvider, koverBucketConfiguration, variantConfig(TOTAL_VARIANT_NAME), projectExtension)
6370
variantArtifacts.values.forEach { totalVariant.mergeWith(it) }
6471
totalReports.assign(totalVariant)
6572

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

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

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

@@ -136,16 +143,16 @@ internal fun KoverContext.finalizing(origins: AllVariantOrigins) {
136143
}
137144

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

145152
private fun KoverContext.variantConfig(variantName: String): KoverVariantCreateConfigImpl {
146-
return projectExtension.current.customVariants.getOrElse(variantName) {
147-
val variantConfig = projectExtension.current.objects.newInstance<KoverVariantCreateConfigImpl>(variantName)
148-
variantConfig.deriveFrom(projectExtension.current)
153+
return projectExtension.currentProject.customVariants.getOrElse(variantName) {
154+
val variantConfig = projectExtension.currentProject.objects.newInstance<KoverVariantCreateConfigImpl>(variantName)
155+
variantConfig.deriveFrom(projectExtension.currentProject)
149156
variantConfig
150157
}
151158
}
@@ -160,7 +167,7 @@ private fun JvmVariantOrigin.createVariant(
160167
koverContext: KoverContext,
161168
config: KoverVariantCreateConfigImpl,
162169
): JvmVariantArtifacts {
163-
tests.instrument(koverContext, koverContext.projectExtension.koverDisabled, koverContext.projectExtension.current)
170+
tests.instrument(koverContext, koverContext.projectExtension.koverDisabled, koverContext.projectExtension.currentProject)
164171
return JvmVariantArtifacts(
165172
koverContext.project,
166173
koverContext.toolProvider,
@@ -175,7 +182,7 @@ private fun AndroidVariantOrigin.createVariant(
175182
koverContext: KoverContext,
176183
config: KoverVariantCreateConfigImpl,
177184
): AndroidVariantArtifacts {
178-
tests.instrument(koverContext, koverContext.projectExtension.koverDisabled, koverContext.projectExtension.current)
185+
tests.instrument(koverContext, koverContext.projectExtension.koverDisabled, koverContext.projectExtension.currentProject)
179186
return AndroidVariantArtifacts(
180187
koverContext.project,
181188
buildVariant.buildVariant,

Diff for: kover-gradle-plugin/src/main/kotlin/kotlinx/kover/gradle/plugin/appliers/KoverMerge.kt

+6-5
Original file line numberDiff line numberDiff line change
@@ -15,15 +15,15 @@ import org.gradle.api.provider.SetProperty
1515
import org.gradle.api.specs.Spec
1616

1717
internal fun KoverContext.prepareMerging() {
18-
if (!projectExtension.isMerged) return
18+
if (!projectExtension.merge.configured) return
1919

2020
val projects = selectProjects()
2121
configSelectedProjects(projects)
2222
}
2323

2424

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

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

86-
merge.sourcesAction?.execute(targetExtension.current.sources.wrap(targetProject))
87-
merge.instrumentationAction?.execute(targetExtension.current.instrumentation.wrap(targetProject))
86+
merge.sourcesAction?.execute(targetExtension.currentProject.sources.wrap(targetProject))
87+
merge.instrumentationAction?.execute(targetExtension.currentProject.instrumentation.wrap(targetProject))
8888
merge.variantsAction.forEach { (variantName, action) ->
89-
targetExtension.current.createVariant(variantName) {
89+
targetExtension.currentProject.createVariant(variantName) {
9090
action.execute(wrap(targetProject))
9191
}
9292
}
@@ -111,6 +111,7 @@ private fun KoverProjectInstrumentation.wrap(project: Project): KoverMergingInst
111111
}
112112
private fun KoverVariantCreateConfig.wrap(project: Project): KoverMergingVariantCreate {
113113
return object : KoverMergingVariantCreate {
114+
override val sources: KoverVariantSources = this@wrap.sources
114115
override fun sources(block: Action<KoverVariantSources>) = this@wrap.sources(block)
115116
override fun add(vararg variantNames: String, optional: Boolean) = this@wrap.add(*variantNames, optional = optional)
116117
override fun addWithDependencies(vararg variantNames: String, optional: Boolean) = this@wrap.addWithDependencies(*variantNames, optional = optional)

Diff for: kover-gradle-plugin/src/main/kotlin/kotlinx/kover/gradle/plugin/appliers/artifacts/AbstractVariantArtifacts.kt

+2-2
Original file line numberDiff line numberDiff line change
@@ -68,8 +68,8 @@ internal sealed class AbstractVariantArtifacts(
6868
}
6969

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

7474
val tests = origin.tests.matching {
7575
!disabledInstrumentation.get()

Diff for: kover-gradle-plugin/src/main/kotlin/kotlinx/kover/gradle/plugin/appliers/tasks/VariantReportsSet.kt

+8-8
Original file line numberDiff line numberDiff line change
@@ -212,14 +212,14 @@ internal class VariantReportsSet(
212212
private fun KoverReportFiltersConfigImpl.convert(): Provider<ReportFilters> {
213213
return project.provider {
214214
ReportFilters(
215-
includesImpl.classes.get(),
216-
includesImpl.annotations.get(),
217-
includesImpl.inheritedFrom.get(),
218-
includesImpl.projects.get(),
219-
excludesImpl.classes.get(),
220-
excludesImpl.annotations.get(),
221-
excludesImpl.inheritedFrom.get(),
222-
excludesImpl.projects.get()
215+
includes.classes.get(),
216+
includes.annotatedBy.get(),
217+
includes.inheritedFrom.get(),
218+
includes.projects.get(),
219+
excludes.classes.get(),
220+
excludes.annotatedBy.get(),
221+
excludes.inheritedFrom.get(),
222+
excludes.projects.get()
223223
)
224224
}
225225
}

0 commit comments

Comments
 (0)