From f433e118e0b5a791c003e0dbc7f8e245ebc8784f Mon Sep 17 00:00:00 2001 From: Olivier Patry Date: Sun, 15 Jun 2025 21:12:43 +0200 Subject: [PATCH 1/5] Kotlin plugin for Jvm project through kotlin("jvm") --- test-util/build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test-util/build.gradle.kts b/test-util/build.gradle.kts index 47b198a..27947c9 100644 --- a/test-util/build.gradle.kts +++ b/test-util/build.gradle.kts @@ -21,7 +21,7 @@ */ plugins { - id("kotlin") + kotlin("jvm") } kotlin { From f4d2e1b830809e401be2a1fe5aed576cd8f3f7c7 Mon Sep 17 00:00:00 2001 From: Olivier Patry Date: Sun, 15 Jun 2025 15:02:31 +0200 Subject: [PATCH 2/5] Harmonize line endings and code style --- android-test-util/build.gradle.kts | 1 - .../main/kotlin/net/opatry/test/util/android/KoinTestRule.kt | 2 +- .../test/util/android/navigation/NavHostControllerTestExt.kt | 2 +- h2go-app/build.gradle.kts | 4 ++-- .../java/net/opatry/h2go/app/navigation/MainNavigationTest.kt | 2 +- .../java/net/opatry/h2go/data/di/databaseTestModule.kt | 2 +- h2go-app/src/main/java/net/opatry/h2go/app/H2GoApplication.kt | 2 +- .../src/main/java/net/opatry/h2go/app/data/H2GoDatabase.kt | 2 +- .../main/java/net/opatry/h2go/app/data/di/databaseModule.kt | 2 +- .../java/net/opatry/h2go/app/navigation/MainNavigation.kt | 2 +- .../main/java/net/opatry/h2go/app/navigation/MainRoutes.kt | 2 +- h2go-app/src/test/java/net/opatry/h2go/app/di/H2GoDITest.kt | 2 +- .../test/java/net/opatry/h2go/data/di/DatabaseModuleTest.kt | 2 +- onboarding/build.gradle.kts | 2 +- .../kotlin/net/opatry/h2go/onboarding/di/onboardingModule.kt | 2 +- .../onboarding/domain/CheckUserPreferencesExistUseCase.kt | 2 +- .../onboarding/domain/SaveInitialUserPreferencesUseCase.kt | 2 +- .../opatry/h2go/onboarding/navigation/OnboardingNavigation.kt | 2 +- .../net/opatry/h2go/onboarding/navigation/OnboardingRoutes.kt | 2 +- .../opatry/h2go/onboarding/presentation/PreferencesEvent.kt | 2 +- .../opatry/h2go/onboarding/presentation/PreferencesUiState.kt | 2 +- .../net/opatry/h2go/onboarding/presentation/UserVolumeUnit.kt | 2 +- .../h2go/onboarding/presentation/UserVolumeUnitMapper.kt | 2 +- .../net/opatry/h2go/onboarding/presentation/WelcomeUiState.kt | 2 +- .../kotlin/net/opatry/h2go/onboarding/ui/PreferencesScreen.kt | 4 ++-- .../kotlin/net/opatry/h2go/onboarding/ui/WelcomeScreen.kt | 4 ++-- .../net/opatry/h2go/onboarding/di/OnboardingModuleTest.kt | 2 +- .../onboarding/domain/CheckUserPreferencesExistUseCaseTest.kt | 2 +- .../domain/SaveInitialUserPreferencesUseCaseTest.kt | 2 +- .../h2go/onboarding/presentation/PreferencesViewModelTest.kt | 2 +- .../h2go/onboarding/presentation/UserVolumeUnitMapperTest.kt | 2 +- .../h2go/onboarding/presentation/WelcomeViewModelTest.kt | 2 +- .../net/opatry/h2go/preference/data/UserPreferencesDao.kt | 2 +- .../net/opatry/h2go/preference/data/UserPreferencesMapper.kt | 2 +- .../h2go/preference/data/UserPreferencesRepositoryImpl.kt | 2 +- .../h2go/preference/data/entity/UserPreferencesEntity.kt | 2 +- .../kotlin/net/opatry/h2go/preference/di/preferencesModule.kt | 2 +- .../h2go/preference/domain/UserPreferencesRepository.kt | 2 +- .../kotlin/net/opatry/h2go/preference/domain/VolumeUnit.kt | 2 +- .../net/opatry/h2go/preference/data/UserPreferencesDaoTest.kt | 2 +- .../opatry/h2go/preference/data/UserPreferencesMapperTest.kt | 2 +- .../h2go/preference/data/UserPreferencesRepositoryTest.kt | 2 +- .../h2go/preference/data/UserPreferencesTestDatabase.kt | 2 +- .../net/opatry/h2go/preference/di/PreferencesModuleTest.kt | 2 +- settings.gradle.kts | 2 +- .../kotlin/net/opatry/test/util/MainDispatcherExtension.kt | 4 +++- 46 files changed, 50 insertions(+), 49 deletions(-) diff --git a/android-test-util/build.gradle.kts b/android-test-util/build.gradle.kts index f16e786..da3fffe 100644 --- a/android-test-util/build.gradle.kts +++ b/android-test-util/build.gradle.kts @@ -20,7 +20,6 @@ * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ - plugins { alias(libs.plugins.android.library) alias(libs.plugins.jetbrains.kotlin.android) diff --git a/android-test-util/src/main/kotlin/net/opatry/test/util/android/KoinTestRule.kt b/android-test-util/src/main/kotlin/net/opatry/test/util/android/KoinTestRule.kt index 0e3868e..851b6c3 100644 --- a/android-test-util/src/main/kotlin/net/opatry/test/util/android/KoinTestRule.kt +++ b/android-test-util/src/main/kotlin/net/opatry/test/util/android/KoinTestRule.kt @@ -49,4 +49,4 @@ class KoinTestRule( override fun finished(description: Description) { unloadKoinModules(modules) } -} \ No newline at end of file +} diff --git a/android-test-util/src/main/kotlin/net/opatry/test/util/android/navigation/NavHostControllerTestExt.kt b/android-test-util/src/main/kotlin/net/opatry/test/util/android/navigation/NavHostControllerTestExt.kt index 9e17d88..72e2cad 100644 --- a/android-test-util/src/main/kotlin/net/opatry/test/util/android/navigation/NavHostControllerTestExt.kt +++ b/android-test-util/src/main/kotlin/net/opatry/test/util/android/navigation/NavHostControllerTestExt.kt @@ -9,4 +9,4 @@ inline fun NavHostController.assertRoute() { assertThat(currentDestination?.hasRoute()) .withFailMessage("Expected %s route but current route is %s", T::class.java.name, currentDestination?.route) .isTrue() -} \ No newline at end of file +} diff --git a/h2go-app/build.gradle.kts b/h2go-app/build.gradle.kts index a704880..ea0b938 100644 --- a/h2go-app/build.gradle.kts +++ b/h2go-app/build.gradle.kts @@ -87,11 +87,11 @@ android { kotlin { jvmToolchain(17) } - + buildFeatures { compose = true } - + packaging { resources { excludes += "/META-INF/{AL2.0,LGPL2.1}" diff --git a/h2go-app/src/androidTest/java/net/opatry/h2go/app/navigation/MainNavigationTest.kt b/h2go-app/src/androidTest/java/net/opatry/h2go/app/navigation/MainNavigationTest.kt index 05bb512..0726647 100644 --- a/h2go-app/src/androidTest/java/net/opatry/h2go/app/navigation/MainNavigationTest.kt +++ b/h2go-app/src/androidTest/java/net/opatry/h2go/app/navigation/MainNavigationTest.kt @@ -122,4 +122,4 @@ class MainNavigationTest { // Then navController.assertRoute() } -} \ No newline at end of file +} diff --git a/h2go-app/src/androidTest/java/net/opatry/h2go/data/di/databaseTestModule.kt b/h2go-app/src/androidTest/java/net/opatry/h2go/data/di/databaseTestModule.kt index 7d4ad50..f4a12e3 100644 --- a/h2go-app/src/androidTest/java/net/opatry/h2go/data/di/databaseTestModule.kt +++ b/h2go-app/src/androidTest/java/net/opatry/h2go/data/di/databaseTestModule.kt @@ -35,4 +35,4 @@ val databaseTestModule = module { single { get().userPreferencesDao() } -} \ No newline at end of file +} diff --git a/h2go-app/src/main/java/net/opatry/h2go/app/H2GoApplication.kt b/h2go-app/src/main/java/net/opatry/h2go/app/H2GoApplication.kt index 9a66516..f2c5ce4 100644 --- a/h2go-app/src/main/java/net/opatry/h2go/app/H2GoApplication.kt +++ b/h2go-app/src/main/java/net/opatry/h2go/app/H2GoApplication.kt @@ -42,4 +42,4 @@ class H2GoApplication : Application(), KoinStartup { onboardingModule, ) } -} \ No newline at end of file +} diff --git a/h2go-app/src/main/java/net/opatry/h2go/app/data/H2GoDatabase.kt b/h2go-app/src/main/java/net/opatry/h2go/app/data/H2GoDatabase.kt index fbf4400..b004e22 100644 --- a/h2go-app/src/main/java/net/opatry/h2go/app/data/H2GoDatabase.kt +++ b/h2go-app/src/main/java/net/opatry/h2go/app/data/H2GoDatabase.kt @@ -35,4 +35,4 @@ import net.opatry.h2go.preference.data.entity.UserPreferencesEntity ) abstract class H2GoDatabase : RoomDatabase() { abstract fun userPreferencesDao(): UserPreferencesDao -} \ No newline at end of file +} diff --git a/h2go-app/src/main/java/net/opatry/h2go/app/data/di/databaseModule.kt b/h2go-app/src/main/java/net/opatry/h2go/app/data/di/databaseModule.kt index 36509a4..8b22ce7 100644 --- a/h2go-app/src/main/java/net/opatry/h2go/app/data/di/databaseModule.kt +++ b/h2go-app/src/main/java/net/opatry/h2go/app/data/di/databaseModule.kt @@ -33,4 +33,4 @@ val databaseModule = module { } single { get().userPreferencesDao() } -} \ No newline at end of file +} diff --git a/h2go-app/src/main/java/net/opatry/h2go/app/navigation/MainNavigation.kt b/h2go-app/src/main/java/net/opatry/h2go/app/navigation/MainNavigation.kt index bd73003..351ee51 100644 --- a/h2go-app/src/main/java/net/opatry/h2go/app/navigation/MainNavigation.kt +++ b/h2go-app/src/main/java/net/opatry/h2go/app/navigation/MainNavigation.kt @@ -49,4 +49,4 @@ fun MainNavigation(navController: NavHostController = rememberNavController()) { } } } -} \ No newline at end of file +} diff --git a/h2go-app/src/main/java/net/opatry/h2go/app/navigation/MainRoutes.kt b/h2go-app/src/main/java/net/opatry/h2go/app/navigation/MainRoutes.kt index bd5207f..db4be9a 100644 --- a/h2go-app/src/main/java/net/opatry/h2go/app/navigation/MainRoutes.kt +++ b/h2go-app/src/main/java/net/opatry/h2go/app/navigation/MainRoutes.kt @@ -27,4 +27,4 @@ import kotlinx.serialization.Serializable object MainRoutes { @Serializable data object Main -} \ No newline at end of file +} diff --git a/h2go-app/src/test/java/net/opatry/h2go/app/di/H2GoDITest.kt b/h2go-app/src/test/java/net/opatry/h2go/app/di/H2GoDITest.kt index 408676f..fe07a6b 100644 --- a/h2go-app/src/test/java/net/opatry/h2go/app/di/H2GoDITest.kt +++ b/h2go-app/src/test/java/net/opatry/h2go/app/di/H2GoDITest.kt @@ -44,4 +44,4 @@ class H2GoDITest { } allModules.verify() } -} \ No newline at end of file +} diff --git a/h2go-app/src/test/java/net/opatry/h2go/data/di/DatabaseModuleTest.kt b/h2go-app/src/test/java/net/opatry/h2go/data/di/DatabaseModuleTest.kt index f080d75..fe0f577 100644 --- a/h2go-app/src/test/java/net/opatry/h2go/data/di/DatabaseModuleTest.kt +++ b/h2go-app/src/test/java/net/opatry/h2go/data/di/DatabaseModuleTest.kt @@ -34,4 +34,4 @@ class DatabaseModuleTest { fun `verify database module`() { databaseModule.verify() } -} \ No newline at end of file +} diff --git a/onboarding/build.gradle.kts b/onboarding/build.gradle.kts index b2bccaf..c2cae06 100644 --- a/onboarding/build.gradle.kts +++ b/onboarding/build.gradle.kts @@ -69,4 +69,4 @@ dependencies { testImplementation(libs.assertj.core) testImplementation(libs.bundles.mockito) testImplementation(libs.koin.test) -} \ No newline at end of file +} diff --git a/onboarding/src/main/kotlin/net/opatry/h2go/onboarding/di/onboardingModule.kt b/onboarding/src/main/kotlin/net/opatry/h2go/onboarding/di/onboardingModule.kt index d55bef0..e7de291 100644 --- a/onboarding/src/main/kotlin/net/opatry/h2go/onboarding/di/onboardingModule.kt +++ b/onboarding/src/main/kotlin/net/opatry/h2go/onboarding/di/onboardingModule.kt @@ -38,4 +38,4 @@ val onboardingModule = module { singleOf(::SaveInitialUserPreferencesUseCase) singleOf(::UserVolumeUnitMapper) viewModelOf(::PreferencesViewModel) -} \ No newline at end of file +} diff --git a/onboarding/src/main/kotlin/net/opatry/h2go/onboarding/domain/CheckUserPreferencesExistUseCase.kt b/onboarding/src/main/kotlin/net/opatry/h2go/onboarding/domain/CheckUserPreferencesExistUseCase.kt index 5806b7b..e99e8c5 100644 --- a/onboarding/src/main/kotlin/net/opatry/h2go/onboarding/domain/CheckUserPreferencesExistUseCase.kt +++ b/onboarding/src/main/kotlin/net/opatry/h2go/onboarding/domain/CheckUserPreferencesExistUseCase.kt @@ -29,4 +29,4 @@ class CheckUserPreferencesExistUseCase( private val userPreferencesRepository: UserPreferencesRepository, ) { suspend operator fun invoke(): Boolean = userPreferencesRepository.getUserPreferences().firstOrNull() != null -} \ No newline at end of file +} diff --git a/onboarding/src/main/kotlin/net/opatry/h2go/onboarding/domain/SaveInitialUserPreferencesUseCase.kt b/onboarding/src/main/kotlin/net/opatry/h2go/onboarding/domain/SaveInitialUserPreferencesUseCase.kt index d5194f7..bc0270a 100644 --- a/onboarding/src/main/kotlin/net/opatry/h2go/onboarding/domain/SaveInitialUserPreferencesUseCase.kt +++ b/onboarding/src/main/kotlin/net/opatry/h2go/onboarding/domain/SaveInitialUserPreferencesUseCase.kt @@ -50,4 +50,4 @@ class SaveInitialUserPreferencesUseCase( ) userPreferencesRepository.updateUserPreferences(preferences) } -} \ No newline at end of file +} diff --git a/onboarding/src/main/kotlin/net/opatry/h2go/onboarding/navigation/OnboardingNavigation.kt b/onboarding/src/main/kotlin/net/opatry/h2go/onboarding/navigation/OnboardingNavigation.kt index a56b63c..0bd855a 100644 --- a/onboarding/src/main/kotlin/net/opatry/h2go/onboarding/navigation/OnboardingNavigation.kt +++ b/onboarding/src/main/kotlin/net/opatry/h2go/onboarding/navigation/OnboardingNavigation.kt @@ -51,4 +51,4 @@ fun NavGraphBuilder.onboardingNavigation( ) } } -} \ No newline at end of file +} diff --git a/onboarding/src/main/kotlin/net/opatry/h2go/onboarding/navigation/OnboardingRoutes.kt b/onboarding/src/main/kotlin/net/opatry/h2go/onboarding/navigation/OnboardingRoutes.kt index 71a1ad1..5be7585 100644 --- a/onboarding/src/main/kotlin/net/opatry/h2go/onboarding/navigation/OnboardingRoutes.kt +++ b/onboarding/src/main/kotlin/net/opatry/h2go/onboarding/navigation/OnboardingRoutes.kt @@ -32,4 +32,4 @@ object OnboardingRoutes { @Serializable data object Preferences -} \ No newline at end of file +} diff --git a/onboarding/src/main/kotlin/net/opatry/h2go/onboarding/presentation/PreferencesEvent.kt b/onboarding/src/main/kotlin/net/opatry/h2go/onboarding/presentation/PreferencesEvent.kt index edaa17a..b89de5a 100644 --- a/onboarding/src/main/kotlin/net/opatry/h2go/onboarding/presentation/PreferencesEvent.kt +++ b/onboarding/src/main/kotlin/net/opatry/h2go/onboarding/presentation/PreferencesEvent.kt @@ -3,4 +3,4 @@ package net.opatry.h2go.onboarding.presentation sealed interface PreferencesEvent { data object NavigateToMain : PreferencesEvent data class Error(val message: String): PreferencesEvent -} \ No newline at end of file +} diff --git a/onboarding/src/main/kotlin/net/opatry/h2go/onboarding/presentation/PreferencesUiState.kt b/onboarding/src/main/kotlin/net/opatry/h2go/onboarding/presentation/PreferencesUiState.kt index 68647d3..dba3430 100644 --- a/onboarding/src/main/kotlin/net/opatry/h2go/onboarding/presentation/PreferencesUiState.kt +++ b/onboarding/src/main/kotlin/net/opatry/h2go/onboarding/presentation/PreferencesUiState.kt @@ -31,4 +31,4 @@ data class PreferencesUiState( val notificationsFrequency: Duration, val notificationsFrequencyBounds: ClosedRange, val isSaving: Boolean, -) \ No newline at end of file +) diff --git a/onboarding/src/main/kotlin/net/opatry/h2go/onboarding/presentation/UserVolumeUnit.kt b/onboarding/src/main/kotlin/net/opatry/h2go/onboarding/presentation/UserVolumeUnit.kt index fcfd56a..f0ca7a1 100644 --- a/onboarding/src/main/kotlin/net/opatry/h2go/onboarding/presentation/UserVolumeUnit.kt +++ b/onboarding/src/main/kotlin/net/opatry/h2go/onboarding/presentation/UserVolumeUnit.kt @@ -19,4 +19,4 @@ sealed interface UserVolumeUnit { override val labelRes: Int get() = R.string.onboarding_preferences_volume_unit_oz } -} \ No newline at end of file +} diff --git a/onboarding/src/main/kotlin/net/opatry/h2go/onboarding/presentation/UserVolumeUnitMapper.kt b/onboarding/src/main/kotlin/net/opatry/h2go/onboarding/presentation/UserVolumeUnitMapper.kt index 5f9881d..e897ba3 100644 --- a/onboarding/src/main/kotlin/net/opatry/h2go/onboarding/presentation/UserVolumeUnitMapper.kt +++ b/onboarding/src/main/kotlin/net/opatry/h2go/onboarding/presentation/UserVolumeUnitMapper.kt @@ -12,4 +12,4 @@ class UserVolumeUnitMapper { UserVolumeUnit.Milliliter -> VolumeUnit.Milliliter UserVolumeUnit.Oz -> VolumeUnit.Oz } -} \ No newline at end of file +} diff --git a/onboarding/src/main/kotlin/net/opatry/h2go/onboarding/presentation/WelcomeUiState.kt b/onboarding/src/main/kotlin/net/opatry/h2go/onboarding/presentation/WelcomeUiState.kt index b031f24..a1c03c7 100644 --- a/onboarding/src/main/kotlin/net/opatry/h2go/onboarding/presentation/WelcomeUiState.kt +++ b/onboarding/src/main/kotlin/net/opatry/h2go/onboarding/presentation/WelcomeUiState.kt @@ -27,4 +27,4 @@ sealed interface WelcomeUiState { data object Idle : WelcomeUiState data object ShowWelcome : WelcomeUiState data object NavigateToMain : WelcomeUiState -} \ No newline at end of file +} diff --git a/onboarding/src/main/kotlin/net/opatry/h2go/onboarding/ui/PreferencesScreen.kt b/onboarding/src/main/kotlin/net/opatry/h2go/onboarding/ui/PreferencesScreen.kt index f8296b7..6f64f53 100644 --- a/onboarding/src/main/kotlin/net/opatry/h2go/onboarding/ui/PreferencesScreen.kt +++ b/onboarding/src/main/kotlin/net/opatry/h2go/onboarding/ui/PreferencesScreen.kt @@ -117,7 +117,7 @@ fun PreferencesScreen( } @Composable -fun PreferencesScreen( +internal fun PreferencesScreen( uiState: PreferencesUiState, onVolumeUnitSelected: (UserVolumeUnit) -> Unit, onNotificationsEnabledChanged: (Boolean) -> Unit, @@ -294,4 +294,4 @@ private fun PreferencesScreenPreview( ) } } -} \ No newline at end of file +} diff --git a/onboarding/src/main/kotlin/net/opatry/h2go/onboarding/ui/WelcomeScreen.kt b/onboarding/src/main/kotlin/net/opatry/h2go/onboarding/ui/WelcomeScreen.kt index 2a77970..2079563 100644 --- a/onboarding/src/main/kotlin/net/opatry/h2go/onboarding/ui/WelcomeScreen.kt +++ b/onboarding/src/main/kotlin/net/opatry/h2go/onboarding/ui/WelcomeScreen.kt @@ -73,7 +73,7 @@ fun WelcomeScreen( } @Composable -fun WelcomeScreen( +internal fun WelcomeScreen( onContinueClicked: () -> Unit, ) { Column( @@ -114,4 +114,4 @@ private fun WelcomeScreenContentPreview() { ) } } -} \ No newline at end of file +} diff --git a/onboarding/src/test/kotlin/net/opatry/h2go/onboarding/di/OnboardingModuleTest.kt b/onboarding/src/test/kotlin/net/opatry/h2go/onboarding/di/OnboardingModuleTest.kt index 2840712..c85e18b 100644 --- a/onboarding/src/test/kotlin/net/opatry/h2go/onboarding/di/OnboardingModuleTest.kt +++ b/onboarding/src/test/kotlin/net/opatry/h2go/onboarding/di/OnboardingModuleTest.kt @@ -43,4 +43,4 @@ class OnboardingModuleTest { ) ) } -} \ No newline at end of file +} diff --git a/onboarding/src/test/kotlin/net/opatry/h2go/onboarding/domain/CheckUserPreferencesExistUseCaseTest.kt b/onboarding/src/test/kotlin/net/opatry/h2go/onboarding/domain/CheckUserPreferencesExistUseCaseTest.kt index 2af1688..6daa53d 100644 --- a/onboarding/src/test/kotlin/net/opatry/h2go/onboarding/domain/CheckUserPreferencesExistUseCaseTest.kt +++ b/onboarding/src/test/kotlin/net/opatry/h2go/onboarding/domain/CheckUserPreferencesExistUseCaseTest.kt @@ -75,4 +75,4 @@ class CheckUserPreferencesExistUseCaseTest { // Then assertThat(result).isFalse() } -} \ No newline at end of file +} diff --git a/onboarding/src/test/kotlin/net/opatry/h2go/onboarding/domain/SaveInitialUserPreferencesUseCaseTest.kt b/onboarding/src/test/kotlin/net/opatry/h2go/onboarding/domain/SaveInitialUserPreferencesUseCaseTest.kt index cc11840..63ddf94 100644 --- a/onboarding/src/test/kotlin/net/opatry/h2go/onboarding/domain/SaveInitialUserPreferencesUseCaseTest.kt +++ b/onboarding/src/test/kotlin/net/opatry/h2go/onboarding/domain/SaveInitialUserPreferencesUseCaseTest.kt @@ -98,4 +98,4 @@ class SaveInitialUserPreferencesUseCaseTest { ) ) } -} \ No newline at end of file +} diff --git a/onboarding/src/test/kotlin/net/opatry/h2go/onboarding/presentation/PreferencesViewModelTest.kt b/onboarding/src/test/kotlin/net/opatry/h2go/onboarding/presentation/PreferencesViewModelTest.kt index bed7a1f..6f92927 100644 --- a/onboarding/src/test/kotlin/net/opatry/h2go/onboarding/presentation/PreferencesViewModelTest.kt +++ b/onboarding/src/test/kotlin/net/opatry/h2go/onboarding/presentation/PreferencesViewModelTest.kt @@ -186,4 +186,4 @@ class PreferencesViewModelTest { ) assertThat(collectedEvents).containsExactly(PreferencesEvent.Error(expectedErrorMessage)) } -} \ No newline at end of file +} diff --git a/onboarding/src/test/kotlin/net/opatry/h2go/onboarding/presentation/UserVolumeUnitMapperTest.kt b/onboarding/src/test/kotlin/net/opatry/h2go/onboarding/presentation/UserVolumeUnitMapperTest.kt index 5bd0675..a3dd88d 100644 --- a/onboarding/src/test/kotlin/net/opatry/h2go/onboarding/presentation/UserVolumeUnitMapperTest.kt +++ b/onboarding/src/test/kotlin/net/opatry/h2go/onboarding/presentation/UserVolumeUnitMapperTest.kt @@ -60,4 +60,4 @@ class UserVolumeUnitMapperTest { // Then assertThat(unitLabelRes).isEqualTo(expectedLabelRes) } -} \ No newline at end of file +} diff --git a/onboarding/src/test/kotlin/net/opatry/h2go/onboarding/presentation/WelcomeViewModelTest.kt b/onboarding/src/test/kotlin/net/opatry/h2go/onboarding/presentation/WelcomeViewModelTest.kt index 0d77bdf..375ad40 100644 --- a/onboarding/src/test/kotlin/net/opatry/h2go/onboarding/presentation/WelcomeViewModelTest.kt +++ b/onboarding/src/test/kotlin/net/opatry/h2go/onboarding/presentation/WelcomeViewModelTest.kt @@ -73,4 +73,4 @@ class WelcomeViewModelTest { advanceUntilIdle() assertThat(viewModel.uiState.value).isEqualTo(WelcomeUiState.ShowWelcome) } -} \ No newline at end of file +} diff --git a/preferences/src/main/kotlin/net/opatry/h2go/preference/data/UserPreferencesDao.kt b/preferences/src/main/kotlin/net/opatry/h2go/preference/data/UserPreferencesDao.kt index 7bfaceb..fe10121 100644 --- a/preferences/src/main/kotlin/net/opatry/h2go/preference/data/UserPreferencesDao.kt +++ b/preferences/src/main/kotlin/net/opatry/h2go/preference/data/UserPreferencesDao.kt @@ -46,4 +46,4 @@ interface UserPreferencesDao { clear() return upsert(defaultPreferences) } -} \ No newline at end of file +} diff --git a/preferences/src/main/kotlin/net/opatry/h2go/preference/data/UserPreferencesMapper.kt b/preferences/src/main/kotlin/net/opatry/h2go/preference/data/UserPreferencesMapper.kt index 652b28e..4c74ae0 100644 --- a/preferences/src/main/kotlin/net/opatry/h2go/preference/data/UserPreferencesMapper.kt +++ b/preferences/src/main/kotlin/net/opatry/h2go/preference/data/UserPreferencesMapper.kt @@ -44,4 +44,4 @@ class UserPreferencesMapper { areNotificationsEnabled = preferences.areNotificationsEnabled, notificationFrequencyInHours = preferences.notificationsFrequency.inWholeHours.toInt(), ) -} \ No newline at end of file +} diff --git a/preferences/src/main/kotlin/net/opatry/h2go/preference/data/UserPreferencesRepositoryImpl.kt b/preferences/src/main/kotlin/net/opatry/h2go/preference/data/UserPreferencesRepositoryImpl.kt index f9c1a13..2a31e31 100644 --- a/preferences/src/main/kotlin/net/opatry/h2go/preference/data/UserPreferencesRepositoryImpl.kt +++ b/preferences/src/main/kotlin/net/opatry/h2go/preference/data/UserPreferencesRepositoryImpl.kt @@ -47,4 +47,4 @@ class UserPreferencesRepositoryImpl( override suspend fun resetUserPreferences(defaultValue: UserPreferences) { dao.reset(mapper.toEntity(defaultValue)) } -} \ No newline at end of file +} diff --git a/preferences/src/main/kotlin/net/opatry/h2go/preference/data/entity/UserPreferencesEntity.kt b/preferences/src/main/kotlin/net/opatry/h2go/preference/data/entity/UserPreferencesEntity.kt index e95d487..0df0011 100644 --- a/preferences/src/main/kotlin/net/opatry/h2go/preference/data/entity/UserPreferencesEntity.kt +++ b/preferences/src/main/kotlin/net/opatry/h2go/preference/data/entity/UserPreferencesEntity.kt @@ -33,4 +33,4 @@ data class UserPreferencesEntity( val volumeUnit: String, val areNotificationsEnabled: Boolean, val notificationFrequencyInHours: Int, -) \ No newline at end of file +) diff --git a/preferences/src/main/kotlin/net/opatry/h2go/preference/di/preferencesModule.kt b/preferences/src/main/kotlin/net/opatry/h2go/preference/di/preferencesModule.kt index 47b51b7..2e61a18 100644 --- a/preferences/src/main/kotlin/net/opatry/h2go/preference/di/preferencesModule.kt +++ b/preferences/src/main/kotlin/net/opatry/h2go/preference/di/preferencesModule.kt @@ -35,4 +35,4 @@ val preferencesModule = module { singleOf(::UserPreferencesRepositoryImpl) bind UserPreferencesRepository::class -} \ No newline at end of file +} diff --git a/preferences/src/main/kotlin/net/opatry/h2go/preference/domain/UserPreferencesRepository.kt b/preferences/src/main/kotlin/net/opatry/h2go/preference/domain/UserPreferencesRepository.kt index ede5214..dba83a8 100644 --- a/preferences/src/main/kotlin/net/opatry/h2go/preference/domain/UserPreferencesRepository.kt +++ b/preferences/src/main/kotlin/net/opatry/h2go/preference/domain/UserPreferencesRepository.kt @@ -30,4 +30,4 @@ interface UserPreferencesRepository { suspend fun updateUserPreferences(preferences: UserPreferences) suspend fun resetUserPreferences(defaultValue: UserPreferences) -} \ No newline at end of file +} diff --git a/preferences/src/main/kotlin/net/opatry/h2go/preference/domain/VolumeUnit.kt b/preferences/src/main/kotlin/net/opatry/h2go/preference/domain/VolumeUnit.kt index fb8ff80..e29fbb3 100644 --- a/preferences/src/main/kotlin/net/opatry/h2go/preference/domain/VolumeUnit.kt +++ b/preferences/src/main/kotlin/net/opatry/h2go/preference/domain/VolumeUnit.kt @@ -25,4 +25,4 @@ package net.opatry.h2go.preference.domain enum class VolumeUnit { Milliliter, Oz, -} \ No newline at end of file +} diff --git a/preferences/src/test/kotlin/net/opatry/h2go/preference/data/UserPreferencesDaoTest.kt b/preferences/src/test/kotlin/net/opatry/h2go/preference/data/UserPreferencesDaoTest.kt index 0299359..7cf66fa 100644 --- a/preferences/src/test/kotlin/net/opatry/h2go/preference/data/UserPreferencesDaoTest.kt +++ b/preferences/src/test/kotlin/net/opatry/h2go/preference/data/UserPreferencesDaoTest.kt @@ -165,4 +165,4 @@ class UserPreferencesDaoTest { val resultingPreferences = dao.getUserPreferences().first() assertThat(resultingPreferences).isEqualTo(defaultPreferences) } -} \ No newline at end of file +} diff --git a/preferences/src/test/kotlin/net/opatry/h2go/preference/data/UserPreferencesMapperTest.kt b/preferences/src/test/kotlin/net/opatry/h2go/preference/data/UserPreferencesMapperTest.kt index b8609df..a984d7a 100644 --- a/preferences/src/test/kotlin/net/opatry/h2go/preference/data/UserPreferencesMapperTest.kt +++ b/preferences/src/test/kotlin/net/opatry/h2go/preference/data/UserPreferencesMapperTest.kt @@ -100,4 +100,4 @@ class UserPreferencesMapperTest { assertThat(result.areNotificationsEnabled).isEqualTo(areNotificationsEnabled) assertThat(result.notificationFrequencyInHours).isEqualTo(3) } -} \ No newline at end of file +} diff --git a/preferences/src/test/kotlin/net/opatry/h2go/preference/data/UserPreferencesRepositoryTest.kt b/preferences/src/test/kotlin/net/opatry/h2go/preference/data/UserPreferencesRepositoryTest.kt index 56bd64f..0ec959b 100644 --- a/preferences/src/test/kotlin/net/opatry/h2go/preference/data/UserPreferencesRepositoryTest.kt +++ b/preferences/src/test/kotlin/net/opatry/h2go/preference/data/UserPreferencesRepositoryTest.kt @@ -133,4 +133,4 @@ class UserPreferencesRepositoryTest { val resultingPreferences = repository.getUserPreferences().first() assertThat(resultingPreferences).isEqualTo(defaultPreferences) } -} \ No newline at end of file +} diff --git a/preferences/src/test/kotlin/net/opatry/h2go/preference/data/UserPreferencesTestDatabase.kt b/preferences/src/test/kotlin/net/opatry/h2go/preference/data/UserPreferencesTestDatabase.kt index 3d69da9..68b1369 100644 --- a/preferences/src/test/kotlin/net/opatry/h2go/preference/data/UserPreferencesTestDatabase.kt +++ b/preferences/src/test/kotlin/net/opatry/h2go/preference/data/UserPreferencesTestDatabase.kt @@ -29,4 +29,4 @@ import net.opatry.h2go.preference.data.entity.UserPreferencesEntity @Database(entities = [UserPreferencesEntity::class], version = 1, exportSchema = false) abstract class UserPreferencesTestDatabase : RoomDatabase() { abstract fun userPreferencesDao(): UserPreferencesDao -} \ No newline at end of file +} diff --git a/preferences/src/test/kotlin/net/opatry/h2go/preference/di/PreferencesModuleTest.kt b/preferences/src/test/kotlin/net/opatry/h2go/preference/di/PreferencesModuleTest.kt index 7e7efaa..b190583 100644 --- a/preferences/src/test/kotlin/net/opatry/h2go/preference/di/PreferencesModuleTest.kt +++ b/preferences/src/test/kotlin/net/opatry/h2go/preference/di/PreferencesModuleTest.kt @@ -41,4 +41,4 @@ class PreferencesModuleTest { ) ) } -} \ No newline at end of file +} diff --git a/settings.gradle.kts b/settings.gradle.kts index f89e5eb..3ae9cd5 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -43,7 +43,7 @@ enableFeaturePreview("TYPESAFE_PROJECT_ACCESSORS") rootProject.name = "H2Go" include(":h2go-app") -include(":preferences") +include(":preferences") include(":onboarding") include(":android-test-util") include(":test-util") diff --git a/test-util/src/main/kotlin/net/opatry/test/util/MainDispatcherExtension.kt b/test-util/src/main/kotlin/net/opatry/test/util/MainDispatcherExtension.kt index ede819f..0b97629 100644 --- a/test-util/src/main/kotlin/net/opatry/test/util/MainDispatcherExtension.kt +++ b/test-util/src/main/kotlin/net/opatry/test/util/MainDispatcherExtension.kt @@ -11,10 +11,12 @@ import org.junit.jupiter.api.extension.ExtensionContext @ExperimentalCoroutinesApi class MainDispatcherExtension : BeforeAllCallback, AfterAllCallback { + override fun beforeAll(context: ExtensionContext?) { Dispatchers.setMain(StandardTestDispatcher()) } + override fun afterAll(context: ExtensionContext?) { Dispatchers.resetMain() } -} \ No newline at end of file +} From cab5a23da21a790fb4de356d64e60b7c8cfa3a56 Mon Sep 17 00:00:00 2001 From: Olivier Patry Date: Sun, 15 Jun 2025 15:09:14 +0200 Subject: [PATCH 3/5] Add detekt to project --- .idea/detekt.xml | 14 ++++++++++++++ build.gradle.kts | 21 +++++++++++++++++++++ detekt.yml | 34 ++++++++++++++++++++++++++++++++++ gradle/libs.versions.toml | 2 ++ 4 files changed, 71 insertions(+) create mode 100644 .idea/detekt.xml create mode 100644 detekt.yml diff --git a/.idea/detekt.xml b/.idea/detekt.xml new file mode 100644 index 0000000..41d2d4a --- /dev/null +++ b/.idea/detekt.xml @@ -0,0 +1,14 @@ + + + + + + \ No newline at end of file diff --git a/build.gradle.kts b/build.gradle.kts index 7f2c30d..453b743 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -20,6 +20,7 @@ * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +import io.gitlab.arturbosch.detekt.Detekt import kotlinx.kover.gradle.plugin.dsl.CoverageUnit import org.gradle.api.tasks.testing.logging.TestExceptionFormat @@ -34,6 +35,7 @@ plugins { alias(libs.plugins.android.library) apply false alias(libs.plugins.about.libraries) apply false alias(libs.plugins.kover) + alias(libs.plugins.detekt) } val koverProjects = listOf( @@ -129,6 +131,25 @@ subprojects { } } + project.afterEvaluate { + apply(plugin = libs.plugins.detekt.get().pluginId) + detekt { + config.setFrom("$rootDir/detekt.yml") + buildUponDefaultConfig = true + allRules = false + parallel = true + } + } + + tasks.withType().configureEach { + reports { + txt.required.set(true) + html.required.set(false) + xml.required.set(false) + sarif.required.set(false) + } + } + tasks.withType().configureEach { useJUnitPlatform() } diff --git a/detekt.yml b/detekt.yml new file mode 100644 index 0000000..a3a67d5 --- /dev/null +++ b/detekt.yml @@ -0,0 +1,34 @@ +processors: + active: true + +naming: + FunctionNaming: + active: true + ignoreAnnotated: ['Composable'] + functionPattern: '^[a-z][A-Za-z0-9]*$' + MatchingDeclarationName: + active: false + excludes: ['**/ui/**'] + ignoreAnnotated: ['Composable', 'VisibleForTesting'] + +style: + UnusedPrivateMember: + active: true + ignoreAnnotated: ['Preview', 'PreviewLightDark'] + MaxLineLength: + active: true + maxLineLength: 120 + excludePackageStatements: true + excludeImportStatements: true + excludeCommentStatements: true + ignoreAnnotated: ['Test'] + +complexity: + LongMethod: + active: true + ignoreAnnotated: ['Composable', 'Test'] + threshold: 60 + +performance: + SpreadOperator: + active: false diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 0f079c6..b8c3dd8 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -23,6 +23,7 @@ junit4 = "4.13.2" junit = "5.10.2" assertj = "3.27.3" kover = "0.9.1" +detekt = "1.23.8" androidx-test-runner = "1.6.2" [libraries] @@ -98,3 +99,4 @@ ksp = { id = "com.google.devtools.ksp", version.ref = "ksp" } androidx-room = { id = "androidx.room", version.ref = "room" } about-libraries = { id = "com.mikepenz.aboutlibraries.plugin", version.ref = "about-libraries" } kover = { id = "org.jetbrains.kotlinx.kover", version.ref = "kover" } +detekt = { id = "io.gitlab.arturbosch.detekt", version.ref = "detekt" } From a90604be9e78f69d1e0891a897167eb7ee739718 Mon Sep 17 00:00:00 2001 From: Olivier Patry Date: Sun, 15 Jun 2025 15:09:41 +0200 Subject: [PATCH 4/5] Run detekt in CI --- .github/workflows/build.yml | 3 +++ .github/workflows/code-style.yml | 24 ++++++++++++++++++++++++ 2 files changed, 27 insertions(+) create mode 100644 .github/workflows/code-style.yml diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 2b4b0cf..6362246 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -26,3 +26,6 @@ jobs: coverage: uses: ./.github/workflows/coverage.yml + + code-style: + uses: ./.github/workflows/code-style.yml \ No newline at end of file diff --git a/.github/workflows/code-style.yml b/.github/workflows/code-style.yml new file mode 100644 index 0000000..7ad3489 --- /dev/null +++ b/.github/workflows/code-style.yml @@ -0,0 +1,24 @@ +on: + workflow_call: + +jobs: + code-style: + name: 👔 Code style + runs-on: ubuntu-24.04 + + steps: + - uses: actions/checkout@v4 + - uses: ./.github/actions/setup-jdk-gradle + + - name: 🕵🏻‍♂️ Detekt + run: | + ./gradlew --no-daemon --parallel --console=plain \ + detekt + echo "### Detekt Report" >> $GITHUB_STEP_SUMMARY + if [ -f build/reports/detekt/detekt.txt ]; then + echo '```' >> $GITHUB_STEP_SUMMARY + cat build/reports/detekt/detekt.txt >> $GITHUB_STEP_SUMMARY + echo '```' >> $GITHUB_STEP_SUMMARY + else + echo "No report found." >> $GITHUB_STEP_SUMMARY + fi \ No newline at end of file From a40c336f71f01427438494712b3d681e38c6af1e Mon Sep 17 00:00:00 2001 From: Olivier Patry Date: Sun, 15 Jun 2025 21:08:21 +0200 Subject: [PATCH 5/5] Add custom detekt rule to enforce clean architecture package boundaries --- .idea/detekt.xml | 5 + build.gradle.kts | 46 ++- detekt-rules/build.gradle.kts | 32 ++ .../detekt/CleanArchitectureBoundaryRule.kt | 61 ++++ .../opatry/detekt/CustomRuleSetProvider.kt | 16 + ...tlab.arturbosch.detekt.api.RuleSetProvider | 1 + .../CleanArchitectureBoundaryRuleTest.kt | 344 ++++++++++++++++++ detekt.yml | 5 + gradle/libs.versions.toml | 3 + settings.gradle.kts | 1 + 10 files changed, 495 insertions(+), 19 deletions(-) create mode 100644 detekt-rules/build.gradle.kts create mode 100644 detekt-rules/src/main/kotlin/net/opatry/detekt/CleanArchitectureBoundaryRule.kt create mode 100644 detekt-rules/src/main/kotlin/net/opatry/detekt/CustomRuleSetProvider.kt create mode 100644 detekt-rules/src/main/resources/META-INF/services/io.gitlab.arturbosch.detekt.api.RuleSetProvider create mode 100644 detekt-rules/src/test/java/net/opatry/detetk/CleanArchitectureBoundaryRuleTest.kt diff --git a/.idea/detekt.xml b/.idea/detekt.xml index 41d2d4a..03d0954 100644 --- a/.idea/detekt.xml +++ b/.idea/detekt.xml @@ -8,6 +8,11 @@