Skip to content

Commit 80574a5

Browse files
authored
refactor: quality gradle plugins (thunderbird#11046)
2 parents c4b3cde + 5931dcb commit 80574a5

108 files changed

Lines changed: 556 additions & 238 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

app-common/src/main/kotlin/net/thunderbird/app/common/account/AccountCreator.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,9 +143,11 @@ internal class AccountCreator(
143143
is SpecialFolderOption.None -> {
144144
if (isAutomatic) SpecialFolderSelection.AUTOMATIC else SpecialFolderSelection.MANUAL
145145
}
146+
146147
is SpecialFolderOption.Regular -> {
147148
SpecialFolderSelection.MANUAL
148149
}
150+
149151
is SpecialFolderOption.Special -> {
150152
if (isAutomatic) SpecialFolderSelection.AUTOMATIC else SpecialFolderSelection.MANUAL
151153
}

app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/ui/page/atom/items/TabItems.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ fun LazyGridScope.tabItems() {
3131
icon = {
3232
when (tabItem) {
3333
PrimaryTabItems.TextOnly -> null
34+
3435
PrimaryTabItems.TextWithIcon, PrimaryTabItems.TextWithIconAndBadge ->
3536
Icon(imageVector = requireNotNull(tabItem.icon))
3637
}

build-plugin/plugin/build.gradle.kts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,14 @@ gradlePlugin {
6767
id = "net.thunderbird.gradle.plugin.quality.coverage"
6868
implementationClass = "net.thunderbird.gradle.plugin.quality.coverage.CodeCoveragePlugin"
6969
}
70+
register("QualityDetekt") {
71+
id = "net.thunderbird.gradle.plugin.quality.detekt"
72+
implementationClass = "net.thunderbird.gradle.plugin.quality.detekt.DetektPlugin"
73+
}
74+
register("QualitySpotless") {
75+
id = "net.thunderbird.gradle.plugin.quality.spotless"
76+
implementationClass = "net.thunderbird.gradle.plugin.quality.spotless.SpotlessPlugin"
77+
}
7078
}
7179
}
7280

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package net.thunderbird.gradle.plugin
2+
3+
import org.gradle.api.JavaVersion
4+
import org.jetbrains.kotlin.gradle.dsl.JvmTarget
5+
6+
object ProjectConfig {
7+
8+
object Compiler {
9+
val javaCompatibility = JavaVersion.VERSION_11
10+
val jvmTarget = JvmTarget.JVM_11
11+
}
12+
}

build-plugin/plugin/src/main/kotlin/net/thunderbird/gradle/plugin/app/badging/BadgingPlugin.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,12 @@ package net.thunderbird.gradle.plugin.app.badging
22

33
import com.android.build.api.artifact.SingleArtifact
44
import com.android.build.api.variant.Aapt2
5+
import com.android.build.api.variant.ApplicationAndroidComponentsExtension
56
import org.gradle.api.Plugin
67
import org.gradle.api.Project
8+
import org.gradle.api.tasks.Copy
79
import org.gradle.kotlin.dsl.assign
810
import org.gradle.kotlin.dsl.configure
9-
import com.android.build.api.variant.ApplicationAndroidComponentsExtension
10-
import org.gradle.api.tasks.Copy
1111
import org.gradle.kotlin.dsl.register
1212

1313
private val variantsToCheck = listOf("release", "beta", "daily")

build-plugin/plugin/src/main/kotlin/net/thunderbird/gradle/plugin/app/badging/GenerateBadgingTask.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import org.gradle.api.tasks.TaskAction
1515
import org.gradle.process.ExecOperations
1616

1717
@CacheableTask
18-
abstract class GenerateBadgingTask : DefaultTask() {
18+
abstract class GenerateBadgingTask : DefaultTask() {
1919
@get:OutputFile
2020
abstract val badging: RegularFileProperty
2121

build-plugin/plugin/src/main/kotlin/net/thunderbird/gradle/plugin/app/versioning/PrintVersionInfoTask.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
package net.thunderbird.gradle.plugin.app.versioning
22

3+
import java.io.File
4+
import javax.xml.parsers.DocumentBuilderFactory
5+
import javax.xml.xpath.XPathConstants
6+
import javax.xml.xpath.XPathFactory
37
import org.gradle.api.DefaultTask
48
import org.gradle.api.file.ConfigurableFileCollection
59
import org.gradle.api.file.RegularFileProperty
@@ -10,10 +14,6 @@ import org.gradle.api.tasks.InputFiles
1014
import org.gradle.api.tasks.Optional
1115
import org.gradle.api.tasks.OutputFile
1216
import org.gradle.api.tasks.TaskAction
13-
import java.io.File
14-
import javax.xml.parsers.DocumentBuilderFactory
15-
import javax.xml.xpath.XPathConstants
16-
import javax.xml.xpath.XPathFactory
1717

1818
abstract class PrintVersionInfoTask : DefaultTask() {
1919
@get:Input

build-plugin/plugin/src/main/kotlin/net/thunderbird/gradle/plugin/app/versioning/VersioningPlugin.kt

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -74,5 +74,3 @@ class VersioningPlugin : Plugin<Project> {
7474
if (it.isLowerCase()) it.titlecase() else it.toString()
7575
}
7676
}
77-
78-

build-plugin/plugin/src/main/kotlin/net/thunderbird/gradle/plugin/quality/coverage/filter/ComposeFilter.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ internal fun KoverReportFiltersConfig.composeFilter() {
99
classes(
1010
// Compose Resources
1111
"*.Res",
12-
"*.ActualResourceCollectorsKt"
12+
"*.ActualResourceCollectorsKt",
1313
)
1414

1515
annotatedBy(
Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,112 @@
1+
package net.thunderbird.gradle.plugin.quality.detekt
2+
3+
import io.gitlab.arturbosch.detekt.Detekt
4+
import io.gitlab.arturbosch.detekt.DetektCreateBaselineTask
5+
import io.gitlab.arturbosch.detekt.extensions.DetektExtension
6+
import net.thunderbird.gradle.plugin.ProjectConfig
7+
import net.thunderbird.gradle.plugin.libs
8+
import org.gradle.api.Plugin
9+
import org.gradle.api.Project
10+
import org.gradle.kotlin.dsl.dependencies
11+
import org.gradle.kotlin.dsl.withType
12+
13+
/**
14+
* Detekt plugin configuration.
15+
*
16+
* Applies the Detekt plugin, sets up configuration, and defines tasks for static code analysis.
17+
*/
18+
class DetektPlugin : Plugin<Project> {
19+
override fun apply(target: Project) {
20+
with(target) {
21+
pluginManager.apply("io.gitlab.arturbosch.detekt")
22+
23+
// Access libs extension lazily since it might not be available yet when the plugin is applied
24+
// (especially in precompiled script plugins). Could be removed once all precompiled script plugins
25+
// are migrated to the new plugin model.
26+
afterEvaluate {
27+
dependencies {
28+
add("detektPlugins", libs.detekt.plugin.compose)
29+
}
30+
}
31+
32+
if (this == rootProject) {
33+
configureRootDetektTasks()
34+
} else {
35+
configureDetekt()
36+
configureDetektTasks()
37+
}
38+
}
39+
}
40+
41+
private fun Project.configureDetekt() {
42+
extensions.configure<DetektExtension>("detekt") {
43+
config.setFrom(project.rootProject.files("config/detekt/detekt.yml"))
44+
45+
val name = project.path.replace(":", "-").replace("/", "-")
46+
baseline = project.rootProject.file("config/detekt/detekt-baseline$name.xml")
47+
48+
ignoredBuildTypes = listOf("release")
49+
}
50+
}
51+
52+
private fun Project.configureDetektTasks() {
53+
with(tasks) {
54+
withType<Detekt>().configureEach {
55+
if (name.contains("androidHostTest", ignoreCase = true)) {
56+
enabled = false
57+
}
58+
59+
jvmTarget = ProjectConfig.Compiler.jvmTarget.target
60+
61+
exclude(defaultExcludes)
62+
63+
reports {
64+
html.required.set(true)
65+
sarif.required.set(true)
66+
xml.required.set(true)
67+
}
68+
69+
tasks.getByName("build").dependsOn(this)
70+
}
71+
72+
withType<DetektCreateBaselineTask>().configureEach {
73+
if (name.contains("androidHostTest", ignoreCase = true)) {
74+
enabled = false
75+
}
76+
77+
jvmTarget = ProjectConfig.Compiler.jvmTarget.target
78+
79+
exclude(defaultExcludes)
80+
}
81+
82+
register("detektAll") {
83+
group = "verification"
84+
description = "Runs detekt on this project"
85+
86+
dependsOn(tasks.withType<Detekt>())
87+
}
88+
}
89+
}
90+
91+
private fun Project.configureRootDetektTasks() {
92+
with(tasks) {
93+
register("detektAll") {
94+
group = "verification"
95+
description = "Runs detekt on the whole project"
96+
97+
allprojects {
98+
this@register.dependsOn(tasks.withType<Detekt>())
99+
}
100+
}
101+
}
102+
}
103+
}
104+
105+
private val defaultExcludes = listOf(
106+
"**/.gradle/**",
107+
"**/.idea/**",
108+
"**/build/**",
109+
"**/generated/**",
110+
".github/**",
111+
"gradle/**",
112+
)

0 commit comments

Comments
 (0)