From a1754f6509dc84797f8494de6e78552f7cd6a485 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petrus=20Nguy=E1=BB=85n=20Th=C3=A1i=20H=E1=BB=8Dc?= Date: Sat, 30 Sep 2023 17:23:20 +0700 Subject: [PATCH 01/10] kotlin 1.9.0, AGP 8.1.0 --- .idea/misc.xml | 2 +- app/build.gradle.kts | 6 +- build.gradle.kts | 63 ++----------------- .../gradle/wrapper/gradle-wrapper.properties | 2 +- buildSrc/src/main/kotlin/deps.kt | 31 +++++---- core-ui/build.gradle.kts | 5 +- .../com/hoc/flowmvi/core_ui/parcelable.kt | 22 +++++++ data/build.gradle.kts | 5 +- .../hoc/flowmvi/data/UserRepositoryImpl.kt | 2 +- .../com/hoc/flowmvi/ui/add/AddActivity.kt | 4 +- .../com/hoc/flowmvi/ui/add/AddContract.kt | 3 +- .../hoc/flowmvi/ui/search/SearchActivity.kt | 4 +- gradle/wrapper/gradle-wrapper.properties | 2 +- mvi/mvi-base/build.gradle.kts | 5 +- mvi/mvi-testing/build.gradle.kts | 4 ++ 15 files changed, 74 insertions(+), 86 deletions(-) create mode 100644 core-ui/src/main/java/com/hoc/flowmvi/core_ui/parcelable.kt diff --git a/.idea/misc.xml b/.idea/misc.xml index 4673587a..962ab90b 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -22,7 +22,7 @@ - + diff --git a/app/build.gradle.kts b/app/build.gradle.kts index bede0b8c..e3081a54 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -39,7 +39,11 @@ android { targetCompatibility = JavaVersion.VERSION_11 } kotlinOptions { jvmTarget = JavaVersion.VERSION_11.toString() } - buildFeatures { viewBinding = true } + + buildFeatures { + viewBinding = true + buildConfig = true + } testOptions { unitTests.isIncludeAndroidResources = true diff --git a/build.gradle.kts b/build.gradle.kts index cb6a3532..16c4f003 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,5 +1,6 @@ import com.github.benmanes.gradle.versions.updates.DependencyUpdatesTask import java.util.EnumSet +import java.util.Locale import org.gradle.api.tasks.testing.logging.TestExceptionFormat import org.gradle.api.tasks.testing.logging.TestLogEvent import org.jetbrains.kotlin.gradle.tasks.KotlinCompile @@ -14,10 +15,10 @@ buildscript { maven(url = "https://oss.sonatype.org/content/repositories/snapshots") } dependencies { - classpath("com.android.tools.build:gradle:7.4.2") + classpath("com.android.tools.build:gradle:8.1.2") classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlinVersion") - classpath("com.diffplug.spotless:spotless-plugin-gradle:6.18.0") - classpath("dev.drewhamilton.poko:poko-gradle-plugin:0.13.0") + classpath("com.diffplug.spotless:spotless-plugin-gradle:6.20.0") + classpath("dev.drewhamilton.poko:poko-gradle-plugin:0.15.0") classpath("org.jacoco:org.jacoco.core:0.8.10") classpath("com.vanniktech:gradle-android-junit-jacoco-plugin:0.17.0-SNAPSHOT") classpath("com.github.ben-manes:gradle-versions-plugin:0.46.0") @@ -26,12 +27,11 @@ buildscript { subprojects { apply(plugin = "com.diffplug.spotless") - apply(plugin = "com.vanniktech.android.junit.jacoco") - apply(plugin = "com.github.ben-manes.versions") fun isNonStable(version: String): Boolean { - val stableKeyword = listOf("RELEASE", "FINAL", "GA").any { version.toUpperCase().contains(it) } + val stableKeyword = listOf("RELEASE", "FINAL", "GA") + .any { version.uppercase().contains(it) } val regex = "^[0-9,.v-]+(-r)?$".toRegex() val isStable = stableKeyword || regex.matches(version) return !isStable @@ -50,35 +50,10 @@ subprojects { } configure { - val EDITOR_CONFIG_KEYS: Set = hashSetOf( - "ij_kotlin_imports_layout", - "indent_size", - "end_of_line", - "charset", - "disabled_rules" - ) - kotlin { target("**/*.kt") - // TODO this should all come from editorconfig https://github.com/diffplug/spotless/issues/142 - val data = mapOf( - "indent_size" to "2", - "ij_kotlin_imports_layout" to "*", - "end_of_line" to "lf", - "charset" to "utf-8", - "disabled_rules" to arrayOf( - "package-name", - "trailing-comma", - "filename", - "experimental:type-parameter-list-spacing", - ).joinToString(separator = ","), - ) - ktlint(ktlintVersion) - .setUseExperimental(true) - .userData(data.filterKeys { it !in EDITOR_CONFIG_KEYS }) - .editorConfigOverride(data.filterKeys { it in EDITOR_CONFIG_KEYS }) trimTrailingWhitespace() indentWithSpaces() @@ -96,16 +71,7 @@ subprojects { kotlinGradle { target("**/*.gradle.kts", "*.gradle.kts") - val data = mapOf( - "indent_size" to "2", - "ij_kotlin_imports_layout" to "*", - "end_of_line" to "lf", - "charset" to "utf-8" - ) ktlint(ktlintVersion) - .setUseExperimental(true) - .userData(data.filterKeys { it !in EDITOR_CONFIG_KEYS }) - .editorConfigOverride(data.filterKeys { it in EDITOR_CONFIG_KEYS }) trimTrailingWhitespace() indentWithSpaces() @@ -113,24 +79,8 @@ subprojects { } } - configure { - jacocoVersion = "0.8.8" - includeNoLocationClasses = true - includeInstrumentationCoverageInMergedReport = true - csv.isEnabled = false - xml.isEnabled = true - html.isEnabled = true - } - afterEvaluate { tasks.withType { - extensions - .getByType() - .run { - isIncludeNoLocationClasses = true - excludes = listOf("jdk.internal.*") - } - maxParallelForks = (Runtime.getRuntime().availableProcessors() / 2).coerceAtLeast(1).also { println("Setting maxParallelForks to $it") } @@ -157,7 +107,6 @@ allprojects { kotlinOptions { val version = JavaVersion.VERSION_11.toString() jvmTarget = version - languageVersion = "1.8" } } diff --git a/buildSrc/gradle/wrapper/gradle-wrapper.properties b/buildSrc/gradle/wrapper/gradle-wrapper.properties index e8be595e..c30b486a 100644 --- a/buildSrc/gradle/wrapper/gradle-wrapper.properties +++ b/buildSrc/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.6.1-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-bin.zip networkTimeout=10000 zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/buildSrc/src/main/kotlin/deps.kt b/buildSrc/src/main/kotlin/deps.kt index 1e7c9a4b..2f33495a 100644 --- a/buildSrc/src/main/kotlin/deps.kt +++ b/buildSrc/src/main/kotlin/deps.kt @@ -7,16 +7,15 @@ import org.gradle.plugin.use.PluginDependenciesSpec import org.gradle.plugin.use.PluginDependencySpec const val ktlintVersion = "0.46.1" -const val kotlinVersion = "1.8.21" +const val kotlinVersion = "1.9.10" object appConfig { const val applicationId = "com.hoc.flowmvi" - const val compileSdkVersion = 33 - const val buildToolsVersion = "33.0.1" - + const val compileSdkVersion = 34 + const val buildToolsVersion = "34.0.0" const val minSdkVersion = 21 - const val targetSdkVersion = 33 + const val targetSdkVersion = 34 private const val MAJOR = 2 private const val MINOR = 1 @@ -28,16 +27,16 @@ object appConfig { object deps { object androidx { const val appCompat = "androidx.appcompat:appcompat:1.6.1" - const val coreKtx = "androidx.core:core-ktx:1.10.1" + const val coreKtx = "androidx.core:core-ktx:1.12.0" const val constraintLayout = "androidx.constraintlayout:constraintlayout:2.1.4" - const val recyclerView = "androidx.recyclerview:recyclerview:1.3.0" + const val recyclerView = "androidx.recyclerview:recyclerview:1.3.1" const val swipeRefreshLayout = "androidx.swiperefreshlayout:swiperefreshlayout:1.2.0-alpha01" const val material = "com.google.android.material:material:1.9.0" const val startup = "androidx.startup:startup-runtime:1.1.1" } object lifecycle { - private const val version = "2.6.1" + private const val version = "2.6.2" const val viewModelKtx = "androidx.lifecycle:lifecycle-viewmodel-ktx:$version" // viewModelScope const val runtimeKtx = "androidx.lifecycle:lifecycle-runtime-ktx:$version" // lifecycleScope @@ -49,11 +48,11 @@ object deps { const val converterMoshi = "com.squareup.retrofit2:converter-moshi:2.9.0" const val loggingInterceptor = "com.squareup.okhttp3:logging-interceptor:4.11.0" const val moshiKotlin = "com.squareup.moshi:moshi-kotlin:1.15.0" - const val leakCanary = "com.squareup.leakcanary:leakcanary-android:2.11" + const val leakCanary = "com.squareup.leakcanary:leakcanary-android:2.12" } object coroutines { - private const val version = "1.7.1" + private const val version = "1.7.3" const val core = "org.jetbrains.kotlinx:kotlinx-coroutines-core:$version" const val android = "org.jetbrains.kotlinx:kotlinx-coroutines-android:$version" @@ -61,7 +60,7 @@ object deps { } object koin { - private const val version = "3.4.0" + private const val version = "3.5.0" const val core = "io.insert-koin:koin-core:$version" const val android = "io.insert-koin:koin-android:$version" @@ -69,13 +68,13 @@ object deps { const val test = "io.insert-koin:koin-test:$version" } - const val coil = "io.coil-kt:coil:2.3.0" + const val coil = "io.coil-kt:coil:2.4.0" const val viewBindingDelegate = "com.github.hoc081098:ViewBindingDelegate:1.4.0" - const val flowExt = "io.github.hoc081098:FlowExt:0.6.1" + const val flowExt = "io.github.hoc081098:FlowExt:0.7.1" const val timber = "com.jakewharton.timber:timber:5.0.1" object arrow { - private const val version = "1.2.0-RC" + private const val version = "1.2.1" const val core = "io.arrow-kt:arrow-core:$version" } @@ -87,11 +86,11 @@ object deps { const val junit = "androidx.test.ext:junit-ktx:1.1.5" object espresso { - const val core = "androidx.test.espresso:espresso-core:3.4.0" + const val core = "androidx.test.espresso:espresso-core:3.5.1" } } - const val mockk = "io.mockk:mockk:1.13.5" + const val mockk = "io.mockk:mockk:1.13.8" const val kotlinJUnit = "org.jetbrains.kotlin:kotlin-test-junit:$kotlinVersion" } } diff --git a/core-ui/build.gradle.kts b/core-ui/build.gradle.kts index 86deb0ec..3e1f4897 100644 --- a/core-ui/build.gradle.kts +++ b/core-ui/build.gradle.kts @@ -10,7 +10,6 @@ android { defaultConfig { minSdk = appConfig.minSdkVersion - targetSdk = appConfig.targetSdkVersion testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" consumerProguardFiles("consumer-rules.pro") @@ -36,6 +35,10 @@ android { unitTests.isIncludeAndroidResources = true unitTests.isReturnDefaultValues = true } + + buildFeatures { + buildConfig = true + } } dependencies { diff --git a/core-ui/src/main/java/com/hoc/flowmvi/core_ui/parcelable.kt b/core-ui/src/main/java/com/hoc/flowmvi/core_ui/parcelable.kt new file mode 100644 index 00000000..0d63631c --- /dev/null +++ b/core-ui/src/main/java/com/hoc/flowmvi/core_ui/parcelable.kt @@ -0,0 +1,22 @@ +package com.hoc.flowmvi.core_ui + +import android.content.Intent +import android.os.Build +import android.os.Bundle +import android.os.Parcelable + +/** + * https://stackoverflow.com/a/73311814/11191424 + */ +inline fun Intent.parcelable(key: String): T? = + // TODO: Use `>`, because https://issuetracker.google.com/issues/240585930#comment6 + if (Build.VERSION.SDK_INT > Build.VERSION_CODES.TIRAMISU) getParcelableExtra(key, T::class.java) + else @Suppress("DEPRECATION") getParcelableExtra(key) + +/** + * https://stackoverflow.com/a/73311814/11191424 + */ +inline fun Bundle.parcelable(key: String): T? = + // TODO: Use `>`, because https://issuetracker.google.com/issues/240585930#comment6 + if (Build.VERSION.SDK_INT > Build.VERSION_CODES.TIRAMISU) getParcelable(key, T::class.java) + else @Suppress("DEPRECATION") getParcelable(key) diff --git a/data/build.gradle.kts b/data/build.gradle.kts index 8c000e54..caa0fc66 100644 --- a/data/build.gradle.kts +++ b/data/build.gradle.kts @@ -11,7 +11,6 @@ android { defaultConfig { minSdk = appConfig.minSdkVersion - targetSdk = appConfig.targetSdkVersion testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" consumerProguardFiles("consumer-rules.pro") @@ -37,6 +36,10 @@ android { unitTests.isIncludeAndroidResources = true unitTests.isReturnDefaultValues = true } + + buildFeatures { + buildConfig = true + } } dependencies { diff --git a/data/src/main/java/com/hoc/flowmvi/data/UserRepositoryImpl.kt b/data/src/main/java/com/hoc/flowmvi/data/UserRepositoryImpl.kt index dbee5bcf..de9a56f0 100644 --- a/data/src/main/java/com/hoc/flowmvi/data/UserRepositoryImpl.kt +++ b/data/src/main/java/com/hoc/flowmvi/data/UserRepositoryImpl.kt @@ -85,7 +85,7 @@ internal class UserRepositoryImpl( } } .onEach { Timber.d("[USER_REPO] Emit users.size=${it.size} ") } - .map { it.right().leftWiden>() } + .map { it.right().leftWiden() } .catch { logError(it, "getUsers") emit(errorMapper(it).left()) diff --git a/feature-add/src/main/java/com/hoc/flowmvi/ui/add/AddActivity.kt b/feature-add/src/main/java/com/hoc/flowmvi/ui/add/AddActivity.kt index 166c1ad5..7484f2c7 100644 --- a/feature-add/src/main/java/com/hoc/flowmvi/ui/add/AddActivity.kt +++ b/feature-add/src/main/java/com/hoc/flowmvi/ui/add/AddActivity.kt @@ -21,13 +21,13 @@ import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.merge -import org.koin.androidx.viewmodel.ext.android.stateViewModel +import org.koin.androidx.viewmodel.ext.android.viewModel import timber.log.Timber @ExperimentalCoroutinesApi class AddActivity : AbstractMviActivity(R.layout.activity_add) { - override val vm by stateViewModel() + override val vm by viewModel() private val addBinding by viewBinding() override fun onOptionsItemSelected(item: MenuItem): Boolean { diff --git a/feature-add/src/main/java/com/hoc/flowmvi/ui/add/AddContract.kt b/feature-add/src/main/java/com/hoc/flowmvi/ui/add/AddContract.kt index 49ec7c0a..b836ed6f 100644 --- a/feature-add/src/main/java/com/hoc/flowmvi/ui/add/AddContract.kt +++ b/feature-add/src/main/java/com/hoc/flowmvi/ui/add/AddContract.kt @@ -5,6 +5,7 @@ import android.os.Parcelable import androidx.core.os.bundleOf import arrow.core.identity import com.hoc.flowmvi.core.EitherNes +import com.hoc.flowmvi.core_ui.parcelable import com.hoc.flowmvi.domain.model.User import com.hoc.flowmvi.domain.model.UserError import com.hoc.flowmvi.domain.model.UserValidationError @@ -46,7 +47,7 @@ data class ViewState( override fun ViewState.toBundle() = bundleOf(VIEW_STATE_KEY to this) override fun restore(bundle: Bundle?) = bundle - ?.getParcelable(VIEW_STATE_KEY) + ?.parcelable(VIEW_STATE_KEY) ?.copy(isLoading = false) ?: initial() } diff --git a/feature-search/src/main/java/com/hoc/flowmvi/ui/search/SearchActivity.kt b/feature-search/src/main/java/com/hoc/flowmvi/ui/search/SearchActivity.kt index 5d337019..fc7cc0e4 100644 --- a/feature-search/src/main/java/com/hoc/flowmvi/ui/search/SearchActivity.kt +++ b/feature-search/src/main/java/com/hoc/flowmvi/ui/search/SearchActivity.kt @@ -31,7 +31,7 @@ import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.merge import kotlinx.coroutines.flow.onEach -import org.koin.androidx.viewmodel.ext.android.stateViewModel +import org.koin.androidx.viewmodel.ext.android.viewModel import timber.log.Timber @ExperimentalCoroutinesApi @@ -40,7 +40,7 @@ import timber.log.Timber class SearchActivity : AbstractMviActivity(R.layout.activity_search) { private val binding by viewBinding() - override val vm by stateViewModel() + override val vm by viewModel() private val searchViewQueryTextEventChannel = Channel() private val searchAdapter = SearchAdapter() diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index e8be595e..c30b486a 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.6.1-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-bin.zip networkTimeout=10000 zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/mvi/mvi-base/build.gradle.kts b/mvi/mvi-base/build.gradle.kts index f7ec0448..6d715efb 100644 --- a/mvi/mvi-base/build.gradle.kts +++ b/mvi/mvi-base/build.gradle.kts @@ -10,7 +10,6 @@ android { defaultConfig { minSdk = appConfig.minSdkVersion - targetSdk = appConfig.targetSdkVersion testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" consumerProguardFiles("consumer-rules.pro") @@ -30,6 +29,10 @@ android { targetCompatibility = JavaVersion.VERSION_11 } kotlinOptions { jvmTarget = JavaVersion.VERSION_11.toString() } + + buildFeatures { + buildConfig = true + } } dependencies { diff --git a/mvi/mvi-testing/build.gradle.kts b/mvi/mvi-testing/build.gradle.kts index 74c584bf..e5967b78 100644 --- a/mvi/mvi-testing/build.gradle.kts +++ b/mvi/mvi-testing/build.gradle.kts @@ -46,6 +46,10 @@ android { targetCompatibility = JavaVersion.VERSION_11 } kotlinOptions { jvmTarget = JavaVersion.VERSION_11.toString() } + + buildFeatures { + buildConfig = true + } } dependencies { From 05eb18ac28be4d95089b1c41865e668c50e56c37 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petrus=20Nguy=E1=BB=85n=20Th=C3=A1i=20H=E1=BB=8Dc?= Date: Sat, 30 Sep 2023 17:23:39 +0700 Subject: [PATCH 02/10] kotlin 1.9.0, AGP 8.1.0 --- .idea/compiler.xml | 22 +++++++++++----------- .idea/gradle.xml | 2 +- .idea/kotlinc.xml | 3 +++ 3 files changed, 15 insertions(+), 12 deletions(-) diff --git a/.idea/compiler.xml b/.idea/compiler.xml index 44afafaf..44e86047 100644 --- a/.idea/compiler.xml +++ b/.idea/compiler.xml @@ -2,17 +2,17 @@ - - - - - - - - - - - + + + + + + + + + + + diff --git a/.idea/gradle.xml b/.idea/gradle.xml index cb99164d..9561532f 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -7,7 +7,7 @@ + + \ No newline at end of file From 52a27f5554c9ec6f8fe6b5d73ad1355da2c79705 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petrus=20Nguy=E1=BB=85n=20Th=C3=A1i=20H=E1=BB=8Dc?= Date: Sat, 30 Sep 2023 17:59:44 +0700 Subject: [PATCH 03/10] Kover --- .github/workflows/unit-test.yml | 5 +---- app/build.gradle.kts | 31 +++++++++++++++++++++++++++- build.gradle.kts | 6 ++++-- core-ui/build.gradle.kts | 1 + core/build.gradle.kts | 1 + coverage.gradle.kts | 36 --------------------------------- data/build.gradle.kts | 1 + domain/build.gradle.kts | 1 + feature-add/build.gradle.kts | 2 +- feature-main/build.gradle.kts | 2 +- feature-search/build.gradle.kts | 2 +- mvi/mvi-base/build.gradle.kts | 1 + 12 files changed, 43 insertions(+), 46 deletions(-) delete mode 100644 coverage.gradle.kts diff --git a/.github/workflows/unit-test.yml b/.github/workflows/unit-test.yml index f5c0d600..5d6cbddc 100644 --- a/.github/workflows/unit-test.yml +++ b/.github/workflows/unit-test.yml @@ -38,10 +38,7 @@ jobs: run: chmod +x ./gradlew - name: Run Android Debug Unit Test - run: ./gradlew jacocoTestReportDebug --warning-mode all --stacktrace - - - name: Run Java/Kotlin Unit Test - run: ./gradlew jacocoTestReport --warning-mode all --stacktrace + run: ./gradlew :app:koverHtmlReport --warning-mode all --stacktrace - name: Upload Test Report uses: codecov/codecov-action@v3.1.4 diff --git a/app/build.gradle.kts b/app/build.gradle.kts index e3081a54..4ec9b031 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -1,7 +1,7 @@ plugins { androidApplication kotlinAndroid - jacoco + id("org.jetbrains.kotlinx.kover") } android { @@ -88,3 +88,32 @@ dependencies { testImplementation(deps.koin.testJunit4) testImplementation(deps.koin.test) } + +dependencies { + kover(project(":feature-main")) + kover(project(":feature-add")) + kover(project(":feature-search")) + kover(project(":domain")) + kover(project(":data")) + kover(project(":core")) + kover(project(":core-ui")) + kover(project(":mvi-base")) +} + +koverReport { + // filters for all report types of all build variants + filters { + excludes { + classes( + "*.databinding.*", + "*.BuildConfig" + ) + } + } + + defaults { + // Tests, sources, classes, and compilation tasks of the 'debug' build variant will be included in the default report. + // Thus, information from the 'app1AppDebug' variant will be included in the default report for this project and any project that specifies this project as a dependency. + mergeWith("debug") // or the name of any build variant needed + } +} diff --git a/build.gradle.kts b/build.gradle.kts index 16c4f003..034c059b 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -7,6 +7,10 @@ import org.jetbrains.kotlin.gradle.tasks.KotlinCompile // Top-level build file where you can add configuration options common to all sub-projects/modules. +plugins { + id("org.jetbrains.kotlinx.kover") version "0.7.3" apply false +} + buildscript { repositories { google() @@ -19,8 +23,6 @@ buildscript { classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlinVersion") classpath("com.diffplug.spotless:spotless-plugin-gradle:6.20.0") classpath("dev.drewhamilton.poko:poko-gradle-plugin:0.15.0") - classpath("org.jacoco:org.jacoco.core:0.8.10") - classpath("com.vanniktech:gradle-android-junit-jacoco-plugin:0.17.0-SNAPSHOT") classpath("com.github.ben-manes:gradle-versions-plugin:0.46.0") } } diff --git a/core-ui/build.gradle.kts b/core-ui/build.gradle.kts index 3e1f4897..9ca76a0b 100644 --- a/core-ui/build.gradle.kts +++ b/core-ui/build.gradle.kts @@ -1,6 +1,7 @@ plugins { androidLib kotlinAndroid + id("org.jetbrains.kotlinx.kover") } android { diff --git a/core/build.gradle.kts b/core/build.gradle.kts index 169a4954..2b85a8b5 100644 --- a/core/build.gradle.kts +++ b/core/build.gradle.kts @@ -1,5 +1,6 @@ plugins { kotlin + id("org.jetbrains.kotlinx.kover") } java { diff --git a/coverage.gradle.kts b/coverage.gradle.kts deleted file mode 100644 index aa6b4a14..00000000 --- a/coverage.gradle.kts +++ /dev/null @@ -1,36 +0,0 @@ -apply(plugin = "jacoco") - -tasks { - val debugCoverageReport by registering(JacocoReport::class) - debugCoverageReport { - dependsOn("testDebugUnitTest") - - reports { - xml.run { - required.value(true) - outputLocation.set(file("$buildDir/reports/jacoco/test/jacocoTestReport.xml")) - } - html.required.value(true) - } - - val kotlinClasses = fileTree("$buildDir/tmp/kotlin-classes/debug") - val coverageSourceDirs = arrayOf( - "src/main/java", - "src/debug/java" - ) - val executionDataDirs = fileTree("$buildDir") { - setIncludes( - listOf( - "jacoco/testDebugUnitTest.exec", - "outputs/code_coverage/debugAndroidTest/connected/*.ec", - "outputs/code-coverage/connected/*coverage.ec" - ) - ) - } - - classDirectories.setFrom(files(kotlinClasses)) - sourceDirectories.setFrom(coverageSourceDirs) - additionalSourceDirs.setFrom(files(coverageSourceDirs)) - executionData.setFrom(executionDataDirs) - } -} diff --git a/data/build.gradle.kts b/data/build.gradle.kts index caa0fc66..5e4c2294 100644 --- a/data/build.gradle.kts +++ b/data/build.gradle.kts @@ -2,6 +2,7 @@ plugins { androidLib kotlinAndroid kotlinKapt + id("org.jetbrains.kotlinx.kover") } android { diff --git a/domain/build.gradle.kts b/domain/build.gradle.kts index ab438cd5..6c023635 100644 --- a/domain/build.gradle.kts +++ b/domain/build.gradle.kts @@ -1,5 +1,6 @@ plugins { kotlin + id("org.jetbrains.kotlinx.kover") } java { diff --git a/feature-add/build.gradle.kts b/feature-add/build.gradle.kts index 4a8b504a..861485c6 100644 --- a/feature-add/build.gradle.kts +++ b/feature-add/build.gradle.kts @@ -2,6 +2,7 @@ plugins { androidLib kotlinAndroid kotlinParcelize + id("org.jetbrains.kotlinx.kover") } android { @@ -11,7 +12,6 @@ android { defaultConfig { minSdk = appConfig.minSdkVersion - targetSdk = appConfig.targetSdkVersion testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" consumerProguardFiles("consumer-rules.pro") diff --git a/feature-main/build.gradle.kts b/feature-main/build.gradle.kts index 24532e9c..14b67785 100644 --- a/feature-main/build.gradle.kts +++ b/feature-main/build.gradle.kts @@ -1,6 +1,7 @@ plugins { androidLib kotlinAndroid + id("org.jetbrains.kotlinx.kover") } android { @@ -10,7 +11,6 @@ android { defaultConfig { minSdk = appConfig.minSdkVersion - targetSdk = appConfig.targetSdkVersion testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" consumerProguardFiles("consumer-rules.pro") diff --git a/feature-search/build.gradle.kts b/feature-search/build.gradle.kts index 70a3be7a..ba4d9dee 100644 --- a/feature-search/build.gradle.kts +++ b/feature-search/build.gradle.kts @@ -2,6 +2,7 @@ plugins { androidLib kotlinAndroid pokoPlugin + id("org.jetbrains.kotlinx.kover") } android { @@ -11,7 +12,6 @@ android { defaultConfig { minSdk = appConfig.minSdkVersion - targetSdk = appConfig.targetSdkVersion testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" consumerProguardFiles("consumer-rules.pro") diff --git a/mvi/mvi-base/build.gradle.kts b/mvi/mvi-base/build.gradle.kts index 6d715efb..46047244 100644 --- a/mvi/mvi-base/build.gradle.kts +++ b/mvi/mvi-base/build.gradle.kts @@ -1,6 +1,7 @@ plugins { androidLib kotlinAndroid + id("org.jetbrains.kotlinx.kover") } android { From cb8a65f4bf38061577fc74b0b12961704bd6df08 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petrus=20Nguy=E1=BB=85n=20Th=C3=A1i=20H=E1=BB=8Dc?= Date: Sat, 30 Sep 2023 18:24:09 +0700 Subject: [PATCH 04/10] ktlint 1.0.0 --- .editorconfig | 27 +- .idea/codeStyles/Project.xml | 4 +- .idea/misc.xml | 1 - README.md | 2 +- app/build.gradle.kts | 18 +- app/src/main/java/com/hoc/flowmvi/App.kt | 17 +- .../java/com/hoc/flowmvi/core/CoreModule.kt | 9 +- .../com/hoc/flowmvi/core/NavigatorImpl.kt | 3 +- .../initializer/ViewBindingInitializer.kt | 3 +- .../java/com/hoc/flowmvi/CheckModulesTest.kt | 17 +- build.gradle.kts | 84 +- buildSrc/build.gradle.kts | 8 +- buildSrc/src/main/kotlin/deps.kt | 2 +- core-ui/build.gradle.kts | 2 +- .../java/com/hoc/flowmvi/core_ui/CollectIn.kt | 22 +- .../com/hoc/flowmvi/core_ui/FlowBinding.kt | 67 +- .../core_ui/SwipeLeftToDeleteCallback.kt | 13 +- .../com/hoc/flowmvi/core_ui/parcelable.kt | 16 +- .../java/com/hoc/flowmvi/core/EitherNes.kt | 7 +- .../java/com/hoc/flowmvi/core/NonEmptySet.kt | 102 +-- .../com/hoc/flowmvi/core/selfReference.kt | 9 +- .../com/hoc/flowmvi/core/NonEmptySetTest.kt | 18 +- data/build.gradle.kts | 2 +- .../java/com/hoc/flowmvi/data/DataModule.kt | 77 +- .../hoc/flowmvi/data/UserRepositoryImpl.kt | 189 +++-- .../data/mapper/UserDomainToUserBodyMapper.kt | 7 +- .../flowmvi/data/mapper/UserErrorMapper.kt | 29 +- .../mapper/UserResponseToUserDomainMapper.kt | 10 +- .../hoc/flowmvi/data/remote/ErrorResponse.kt | 2 + .../hoc/flowmvi/data/remote/UserApiService.kt | 12 +- .../hoc/flowmvi/data/remote/UserResponse.kt | 2 +- .../data/UserRepositoryImplRealAPITest.kt | 86 +- .../flowmvi/data/UserRepositoryImplTest.kt | 398 ++++----- .../mapper/UserDomainToUserBodyMapperTest.kt | 22 +- .../data/mapper/UserErrorMapperTest.kt | 62 +- .../UserResponseToUserDomainMapperTest.kt | 49 +- .../com/hoc/flowmvi/domain/DomainModule.kt | 15 +- .../com/hoc/flowmvi/domain/model/Email.kt | 7 +- .../com/hoc/flowmvi/domain/model/FirstName.kt | 7 +- .../com/hoc/flowmvi/domain/model/LastName.kt | 7 +- .../java/com/hoc/flowmvi/domain/model/User.kt | 27 +- .../com/hoc/flowmvi/domain/model/UserError.kt | 15 +- .../domain/model/UserValidationError.kt | 3 +- .../flowmvi/domain/usecase/AddUserUseCase.kt | 4 +- .../flowmvi/domain/usecase/GetUsersUseCase.kt | 4 +- .../domain/usecase/RefreshGetUsersUseCase.kt | 4 +- .../domain/usecase/RemoveUserUseCase.kt | 4 +- .../domain/usecase/SearchUsersUseCase.kt | 7 +- .../com/hoc/flowmvi/domain/UseCaseTest.kt | 183 +++-- .../java/com/hoc/flowmvi/domain/UserTest.kt | 128 +-- feature-add/build.gradle.kts | 2 +- .../com/hoc/flowmvi/ui/add/AddActivity.kt | 97 +-- .../com/hoc/flowmvi/ui/add/AddContract.kt | 119 ++- .../java/com/hoc/flowmvi/ui/add/AddModule.kt | 11 +- .../main/java/com/hoc/flowmvi/ui/add/AddVM.kt | 122 +-- .../java/com/hoc/flowmvi/ui/add/AddVMTest.kt | 493 ++++++------ feature-main/build.gradle.kts | 2 +- .../com/hoc/flowmvi/ui/main/MainActivity.kt | 47 +- .../com/hoc/flowmvi/ui/main/MainContract.kt | 118 ++- .../com/hoc/flowmvi/ui/main/MainModule.kt | 7 +- .../java/com/hoc/flowmvi/ui/main/MainVM.kt | 105 +-- .../com/hoc/flowmvi/ui/main/UserAdapter.kt | 29 +- .../hoc/flowmvi/ui/main/MainContractTest.kt | 49 +- .../com/hoc/flowmvi/ui/main/MainVMTest.kt | 391 ++++----- .../java/com/hoc/flowmvi/ui/main/TestData.kt | 47 +- feature-search/build.gradle.kts | 2 +- .../hoc/flowmvi/ui/search/SearchActivity.kt | 60 +- .../hoc/flowmvi/ui/search/SearchAdapter.kt | 31 +- .../hoc/flowmvi/ui/search/SearchContract.kt | 98 ++- .../com/hoc/flowmvi/ui/search/SearchModule.kt | 11 +- .../com/hoc/flowmvi/ui/search/SearchVM.kt | 77 +- .../flowmvi/ui/search/SearchContractTest.kt | 20 +- .../com/hoc/flowmvi/ui/search/SearchVMTest.kt | 756 +++++++++--------- .../com/hoc/flowmvi/ui/search/TestData.kt | 47 +- mvi/mvi-base/build.gradle.kts | 2 +- .../flowmvi/mvi_base/AbstractMviActivity.kt | 10 +- .../flowmvi/mvi_base/AbstractMviViewModel.kt | 15 +- .../hoc/flowmvi/mvi_base/MviSingleEvent.kt | 1 + .../java/com/hoc/flowmvi/mvi_base/MviView.kt | 6 +- .../com/hoc/flowmvi/mvi_base/MviViewState.kt | 1 + mvi/mvi-testing/build.gradle.kts | 7 +- .../mvi_testing/BaseMviViewModelTest.kt | 136 ++-- settings.gradle.kts | 28 +- .../test_utils/TestAppCoroutineDispatchers.kt | 5 +- 84 files changed, 2575 insertions(+), 2190 deletions(-) diff --git a/.editorconfig b/.editorconfig index 4bda7f7f..098208df 100644 --- a/.editorconfig +++ b/.editorconfig @@ -1,14 +1,19 @@ -root = true - +root=true [*] -indent_size = 2 -end_of_line = lf -charset = utf-8 -trim_trailing_whitespace = true -insert_final_newline = true - +indent_size=2 +end_of_line=lf +charset=utf-8 +trim_trailing_whitespace=true +insert_final_newline=true [*.{kt,kts}] -ij_kotlin_imports_layout = * - +ij_kotlin_imports_layout=* +ij_continuation_indent_size=4 +ktlint_standard_filename=disabled +ktlint_standard_package-name=disabled +ktlint_standard_property-naming=disabled +ktlint_standard_function-naming=disabled +ktlint_standard_no-empty-file=disabled +filename=disabled +ktlint_experimental=enabled [*.xml] -indent_size = 4 +indent_size=4 diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml index 17eb6a80..1cae6040 100644 --- a/.idea/codeStyles/Project.xml +++ b/.idea/codeStyles/Project.xml @@ -7,8 +7,6 @@ - + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml index 962ab90b..0f4ea7c0 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,4 +1,3 @@ -