Skip to content

Commit 4a14d13

Browse files
authored
Feat: Static Analysis & Lint Setup (#2208)
1 parent 5056cd3 commit 4a14d13

File tree

138 files changed

+10064
-250
lines changed

Some content is hidden

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

138 files changed

+10064
-250
lines changed

.github/workflows/android.yml

Lines changed: 1 addition & 100 deletions
Original file line numberDiff line numberDiff line change
@@ -28,103 +28,4 @@ jobs:
2828
# Artifact name
2929
name: android-client-app
3030
# File path describing what artifact to upload
31-
path: mifosng-android/build/outputs/apk/debug/mifosng-android-debug.apk
32-
33-
test:
34-
needs: build
35-
runs-on: ubuntu-latest
36-
steps:
37-
- uses: actions/checkout@v2
38-
39-
# Set up JDK 17
40-
- name: Set up JDK 17
41-
uses: actions/setup-java@v1
42-
with:
43-
java-version: 17
44-
45-
# Test with Gradle
46-
- name: Test App
47-
run: ./gradlew test
48-
49-
# Upload test reports
50-
- name: Upload Test Reports
51-
uses: actions/[email protected]
52-
with:
53-
# Artifact name
54-
name: test-reports
55-
# File path describing what artifact to upload
56-
path: mifosng-android/build/reports/tests/**
57-
58-
lintCheck:
59-
needs: build
60-
runs-on: ubuntu-latest
61-
steps:
62-
- uses: actions/checkout@v2
63-
64-
# Set up JDK 17
65-
- name: Set up JDK 17
66-
uses: actions/setup-java@v1
67-
with:
68-
java-version: 17
69-
70-
# Perform Lint Check
71-
- name: Lint Check
72-
run: ./gradlew lint
73-
74-
# Upload reports
75-
- name: Upload Lint Reports
76-
uses: actions/[email protected]
77-
with:
78-
# Artifact name
79-
name: lint-reports
80-
# File path describing what artifact to upload
81-
path: mifosng-android/build/reports/lint-results**
82-
83-
pmd:
84-
needs: build
85-
runs-on: ubuntu-latest
86-
steps:
87-
- uses: actions/checkout@v2
88-
89-
# Set up JDK 17
90-
- name: Set up JDK 17
91-
uses: actions/setup-java@v1
92-
with:
93-
java-version: 17
94-
95-
# Perform PMD Check
96-
- name: PMD Check
97-
run: ./gradlew pmd
98-
99-
# Upload reports
100-
- name: Upload PMD Reports
101-
uses: actions/[email protected]
102-
with:
103-
# Artifact name
104-
name: pmd-reports
105-
# File path describing what artifact to upload
106-
path: mifosng-android/build/reports/pmd/**
107-
108-
checkstyle:
109-
needs: build
110-
runs-on: ubuntu-latest
111-
steps:
112-
- uses: actions/checkout@v2
113-
114-
# Set up JDK 17
115-
- name: Set up JDK 17
116-
uses: actions/setup-java@v1
117-
with:
118-
java-version: 17
119-
# Perform Checkstyle Check
120-
- name: Checkstyle
121-
run: ./gradlew checkstyle
122-
123-
# Upload reports
124-
- name: Upload Checkstyle Reports
125-
uses: actions/[email protected]
126-
with:
127-
# Artifact name
128-
name: checkstyle-reports
129-
# File path describing what artifact to upload
130-
path: mifosng-android/build/reports/checkstyle/**
31+
path: mifosng-android/build/outputs/apk/debug/mifosng-android-debug.apk

build-logic/convention/build.gradle.kts

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,12 @@ dependencies {
2424
compileOnly(libs.firebase.crashlytics.gradlePlugin)
2525
compileOnly(libs.firebase.performance.gradlePlugin)
2626
compileOnly(libs.kotlin.gradlePlugin)
27+
// compileOnly(libs.compose.gradlePlugin)
2728
compileOnly(libs.ksp.gradlePlugin)
2829
compileOnly(libs.room.gradlePlugin)
30+
compileOnly(libs.detekt.gradlePlugin)
31+
compileOnly(libs.ktlint.gradlePlugin)
32+
compileOnly(libs.spotless.gradlePlugin)
2933
implementation(libs.truth)
3034
}
3135

@@ -94,5 +98,25 @@ gradlePlugin {
9498
id = "mifos.jvm.library"
9599
implementationClass = "JvmLibraryConventionPlugin"
96100
}
101+
register("detekt") {
102+
id = "mifos.detekt.plugin"
103+
implementationClass = "MifosDetektConventionPlugin"
104+
description = "Configures detekt for the project"
105+
}
106+
register("spotless") {
107+
id = "mifos.spotless.plugin"
108+
implementationClass = "MifosSpotlessConventionPlugin"
109+
description = "Configures spotless for the project"
110+
}
111+
register("ktlint") {
112+
id = "mifos.ktlint.plugin"
113+
implementationClass = "MifosKtlintConventionPlugin"
114+
description = "Configures kotlinter for the project"
115+
}
116+
register("gitHooks") {
117+
id = "mifos.git.hooks"
118+
implementationClass = "MifosGitHooksConventionPlugin"
119+
description = "Installs git hooks for the project"
120+
}
97121
}
98122
}

build-logic/convention/src/main/kotlin/AndroidApplicationComposeConventionPlugin.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,15 @@
11
import com.android.build.api.dsl.ApplicationExtension
22
import org.gradle.api.Plugin
33
import org.gradle.api.Project
4+
import org.gradle.kotlin.dsl.apply
45
import org.gradle.kotlin.dsl.getByType
56
import org.mifos.configureAndroidCompose
67

78
class AndroidApplicationComposeConventionPlugin : Plugin<Project> {
89
override fun apply(target: Project) {
910
with(target) {
10-
pluginManager.apply("com.android.application")
11+
apply(plugin = "com.android.application")
12+
// apply(plugin = "org.jetbrains.kotlin.plugin.compose")
1113

1214
val extension = extensions.getByType<ApplicationExtension>()
1315
configureAndroidCompose(extension)

build-logic/convention/src/main/kotlin/AndroidApplicationConventionPlugin.kt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,12 @@ class AndroidApplicationConventionPlugin : Plugin<Project> {
1717
apply("com.android.application")
1818
apply("org.jetbrains.kotlin.android")
1919
apply("mifos.android.lint")
20+
apply("mifos.android.application.jacoco")
21+
apply("com.dropbox.dependency-guard")
22+
apply("mifos.detekt.plugin")
23+
apply("mifos.spotless.plugin")
24+
apply("mifos.ktlint.plugin")
25+
// apply("mifos.git.hooks")
2026
}
2127

2228
extensions.configure<ApplicationExtension> {

build-logic/convention/src/main/kotlin/AndroidFeatureConventionPlugin.kt

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import org.gradle.api.Plugin
33
import org.gradle.api.Project
44
import org.gradle.kotlin.dsl.configure
55
import org.gradle.kotlin.dsl.dependencies
6+
import org.gradle.kotlin.dsl.kotlin
67
import org.mifos.configureGradleManagedDevices
78
import org.mifos.libs
89

@@ -26,14 +27,33 @@ class AndroidFeatureConventionPlugin : Plugin<Project> {
2627
add("implementation", project(":core:ui"))
2728
add("implementation", project(":core:designsystem"))
2829
add("implementation", project(":core:common"))
30+
add("implementation", project(":core:model"))
2931
add("implementation", project(":core:data"))
32+
add("implementation", project(":core:domain"))
33+
34+
// This could be removed after migrating to Room
35+
add("implementation", libs.findLibrary("dbflow").get())
36+
37+
add("implementation", libs.findLibrary("kotlinx.collections.immutable").get())
3038

3139
add("implementation", libs.findLibrary("androidx.hilt.navigation.compose").get())
3240
add("implementation", libs.findLibrary("androidx.lifecycle.runtimeCompose").get())
3341
add("implementation", libs.findLibrary("androidx.lifecycle.viewModelCompose").get())
34-
add("implementation", libs.findLibrary("androidx.tracing.ktx").get())
3542

3643
add("androidTestImplementation", libs.findLibrary("androidx.lifecycle.runtimeTesting").get())
44+
45+
add("testImplementation", kotlin("test"))
46+
add("testImplementation", project(":core:testing"))
47+
add("testImplementation", libs.findLibrary("hilt.android.testing").get())
48+
add("testImplementation", libs.findLibrary("squareup.okhttp").get())
49+
50+
add("debugImplementation", libs.findLibrary("androidx.compose.ui.test.manifest").get())
51+
52+
add("androidTestImplementation", project(":core:testing"))
53+
add("androidTestImplementation", libs.findLibrary("androidx.navigation.testing").get())
54+
add("androidTestImplementation", libs.findLibrary("androidx.compose.ui.test").get())
55+
add("androidTestImplementation", libs.findLibrary("hilt.android.testing").get())
56+
add("androidTestImplementation", libs.findLibrary("androidx.lifecycle.runtimeTesting").get())
3757
}
3858
}
3959
}

build-logic/convention/src/main/kotlin/AndroidLibraryComposeConventionPlugin.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,15 @@
11
import com.android.build.gradle.LibraryExtension
22
import org.gradle.api.Plugin
33
import org.gradle.api.Project
4+
import org.gradle.kotlin.dsl.apply
45
import org.gradle.kotlin.dsl.getByType
56
import org.mifos.configureAndroidCompose
67

78
class AndroidLibraryComposeConventionPlugin : Plugin<Project> {
89
override fun apply(target: Project) {
910
with(target) {
10-
pluginManager.apply("com.android.library")
11+
apply(plugin = "com.android.library")
12+
// apply(plugin = "org.jetbrains.kotlin.plugin.compose")
1113

1214
val extension = extensions.getByType<LibraryExtension>()
1315
configureAndroidCompose(extension)

build-logic/convention/src/main/kotlin/AndroidLibraryConventionPlugin.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,11 @@ class AndroidLibraryConventionPlugin : Plugin<Project> {
1818
with(pluginManager) {
1919
apply("com.android.library")
2020
apply("org.jetbrains.kotlin.android")
21+
apply("mifos.android.library.jacoco")
2122
apply("mifos.android.lint")
23+
apply("mifos.detekt.plugin")
24+
apply("mifos.spotless.plugin")
25+
apply("mifos.ktlint.plugin")
2226
}
2327

2428
extensions.configure<LibraryExtension> {

build-logic/convention/src/main/kotlin/AndroidLintConventionPlugin.kt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import com.android.build.api.dsl.Lint
44
import org.gradle.api.Plugin
55
import org.gradle.api.Project
66
import org.gradle.kotlin.dsl.configure
7+
import java.io.File
78

89
class AndroidLintConventionPlugin : Plugin<Project> {
910
override fun apply(target: Project) {
@@ -27,4 +28,10 @@ class AndroidLintConventionPlugin : Plugin<Project> {
2728
private fun Lint.configure() {
2829
xmlReport = true
2930
checkDependencies = true
31+
abortOnError = false
32+
// Disable this rule until we ship the libraries to some maven.
33+
disable += "ResourceName"
34+
baseline = File("lint-baseline.xml")
35+
explainIssues = true
36+
htmlReport = true
3037
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import org.gradle.api.Plugin
2+
import org.gradle.api.Project
3+
import org.mifos.configureDetekt
4+
import org.mifos.detektGradle
5+
6+
class MifosDetektConventionPlugin : Plugin<Project> {
7+
override fun apply(target: Project) {
8+
with(target) {
9+
applyPlugins()
10+
11+
detektGradle {
12+
configureDetekt(this)
13+
}
14+
}
15+
}
16+
17+
private fun Project.applyPlugins() {
18+
pluginManager.apply {
19+
apply("io.gitlab.arturbosch.detekt")
20+
}
21+
}
22+
}
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
2+
import org.gradle.api.Plugin
3+
import org.gradle.api.Project
4+
import org.gradle.api.tasks.Copy
5+
import org.gradle.api.tasks.Exec
6+
import org.gradle.kotlin.dsl.register
7+
import java.util.Locale
8+
9+
class MifosGitHooksConventionPlugin : Plugin<Project> {
10+
override fun apply(project: Project) {
11+
// Define a function to check if the OS is Linux or MacOS
12+
fun isLinuxOrMacOs(): Boolean {
13+
val osName = System.getProperty("os.name").lowercase(Locale.getDefault())
14+
return osName.contains("linux") || osName.contains("mac os") || osName.contains("macos")
15+
}
16+
17+
// Define the copyGitHooks task
18+
project.tasks.register<Copy>("copyGitHooks") {
19+
description = "Copies the git hooks from /scripts to the .git/hooks folder."
20+
from("${project.rootDir}/scripts/") {
21+
include("**/*.sh")
22+
rename { it.removeSuffix(".sh") }
23+
}
24+
into("${project.rootDir}/.git/hooks")
25+
}
26+
27+
// Define the installGitHooks task
28+
project.tasks.register<Exec>("installGitHooks") {
29+
description = "Installs the pre-commit git hooks from the scripts directory."
30+
group = "git hooks"
31+
workingDir = project.rootDir
32+
33+
if (isLinuxOrMacOs()) {
34+
commandLine("chmod", "-R", "+x", ".git/hooks/")
35+
}else {
36+
commandLine("cmd", "/c", "attrib", "-R", "+X", ".git/hooks/*.*")
37+
}
38+
dependsOn(project.tasks.named("copyGitHooks"))
39+
40+
doLast {
41+
println("Git hooks installed successfully.")
42+
}
43+
}
44+
45+
// Configure task dependencies after evaluation
46+
project.afterEvaluate {
47+
project.tasks.matching {
48+
it.name in listOf("preBuild", "build", "assembleDebug", "assembleRelease", "installDebug", "installRelease", "clean")
49+
}.configureEach {
50+
dependsOn(project.tasks.named("installGitHooks"))
51+
}
52+
}
53+
}
54+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import org.gradle.api.Plugin
2+
import org.gradle.api.Project
3+
4+
class MifosKtlintConventionPlugin : Plugin<Project> {
5+
override fun apply(target: Project) {
6+
with(target) {
7+
applyPlugins()
8+
}
9+
}
10+
11+
private fun Project.applyPlugins() {
12+
pluginManager.apply {
13+
apply("org.jlleitschuh.gradle.ktlint")
14+
}
15+
}
16+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import org.gradle.api.Plugin
2+
import org.gradle.api.Project
3+
import org.mifos.configureSpotless
4+
import org.mifos.spotlessGradle
5+
6+
class MifosSpotlessConventionPlugin : Plugin<Project> {
7+
override fun apply(target: Project) {
8+
with(target) {
9+
applyPlugins()
10+
11+
spotlessGradle {
12+
configureSpotless(this)
13+
}
14+
}
15+
}
16+
17+
private fun Project.applyPlugins() {
18+
pluginManager.apply {
19+
apply("com.diffplug.spotless")
20+
}
21+
}
22+
}

build-logic/convention/src/main/kotlin/org/mifos/AndroidCompose.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
1010
* Configure Compose-specific options
1111
*/
1212
internal fun Project.configureAndroidCompose(
13-
commonExtension: CommonExtension<*, *, *, *, *>,
13+
commonExtension: CommonExtension<*, *, *, *, *, *>,
1414
) {
1515
commonExtension.apply {
1616
buildFeatures {

0 commit comments

Comments
 (0)