diff --git a/app/src/main/java/co/touchlab/kampkit/android/MainApp.kt b/app/src/main/java/co/touchlab/kampkit/android/MainApp.kt index d40cc2c9..cccc2412 100644 --- a/app/src/main/java/co/touchlab/kampkit/android/MainApp.kt +++ b/app/src/main/java/co/touchlab/kampkit/android/MainApp.kt @@ -7,7 +7,7 @@ import android.util.Log import co.touchlab.kampkit.AppInfo import co.touchlab.kampkit.initKoin import co.touchlab.kampkit.models.BreedViewModel -import org.koin.androidx.viewmodel.dsl.viewModel +import org.koin.androidx.viewmodel.dsl.viewModelOf import org.koin.core.parameter.parametersOf import org.koin.dsl.module @@ -18,7 +18,9 @@ class MainApp : Application() { initKoin( module { single { this@MainApp } - viewModel { BreedViewModel(get(), get { parametersOf("BreedViewModel") }) } + viewModelOf(::BreedViewModel) { + parametersOf("BreedViewModel") + } single { get().getSharedPreferences("KAMPSTARTER_SETTINGS", Context.MODE_PRIVATE) } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index c5ed78bc..07667fed 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -32,7 +32,7 @@ kermit = "1.1.3" stately = "1.2.3" accompanist-swiperefresh = "0.25.1" -koin = "3.2.0" +koin = "3.3.0" multiplatformSettings = "1.0.0-alpha01" turbine = "0.12.1" sqlDelight = "1.5.3" diff --git a/shared/src/androidMain/kotlin/co/touchlab/kampkit/KoinAndroid.kt b/shared/src/androidMain/kotlin/co/touchlab/kampkit/KoinAndroid.kt index ed6bc238..130e8463 100644 --- a/shared/src/androidMain/kotlin/co/touchlab/kampkit/KoinAndroid.kt +++ b/shared/src/androidMain/kotlin/co/touchlab/kampkit/KoinAndroid.kt @@ -7,6 +7,8 @@ import com.squareup.sqldelight.android.AndroidSqliteDriver import com.squareup.sqldelight.db.SqlDriver import io.ktor.client.engine.okhttp.OkHttp import org.koin.core.module.Module +import org.koin.core.module.dsl.singleOf +import org.koin.dsl.bind import org.koin.dsl.module actual val platformModule: Module = module { @@ -18,9 +20,7 @@ actual val platformModule: Module = module { ) } - single { - SharedPreferencesSettings(get()) - } + singleOf(::SharedPreferencesSettings) bind Settings::class single { OkHttp.create() diff --git a/shared/src/androidTest/kotlin/co/touchlab/kampkit/KoinTest.kt b/shared/src/androidTest/kotlin/co/touchlab/kampkit/KoinTest.kt index 4be2ca84..bf2b2290 100644 --- a/shared/src/androidTest/kotlin/co/touchlab/kampkit/KoinTest.kt +++ b/shared/src/androidTest/kotlin/co/touchlab/kampkit/KoinTest.kt @@ -2,16 +2,18 @@ package co.touchlab.kampkit import android.app.Application import android.content.Context +import android.content.SharedPreferences import androidx.test.core.app.ApplicationProvider.getApplicationContext import androidx.test.ext.junit.runners.AndroidJUnit4 -import co.touchlab.kermit.Logger +import co.touchlab.kermit.LoggerConfig +import kotlinx.coroutines.CoroutineDispatcher import org.junit.experimental.categories.Category import org.junit.runner.RunWith +import org.koin.core.annotation.KoinExperimentalAPI import org.koin.core.context.stopKoin -import org.koin.core.parameter.parametersOf import org.koin.dsl.module import org.koin.test.category.CheckModuleTest -import org.koin.test.check.checkModules +import org.koin.test.verify.verify import org.robolectric.annotation.Config import kotlin.test.AfterTest import kotlin.test.Test @@ -21,18 +23,33 @@ import kotlin.test.Test @Config(sdk = [32]) class KoinTest { + @OptIn(KoinExperimentalAPI::class) @Test fun checkAllModules() { - initKoin( - module { - single { getApplicationContext() } - single { get().getSharedPreferences("TEST", Context.MODE_PRIVATE) } - single { TestAppInfo } - single { {} } + val testModule = module { + single { getApplicationContext() } + single { + get().getSharedPreferences( + "TEST", + Context.MODE_PRIVATE + ) } - ).checkModules { - withParameters { parametersOf("TestTag") } + single { TestAppInfo } + single { {} } + + includes( + platformModule, + coreModule + ) } + testModule.verify( + extraTypes = listOf( + Boolean::class, + LoggerConfig::class, + String::class, + CoroutineDispatcher::class + ) + ) } @AfterTest diff --git a/shared/src/commonMain/kotlin/co/touchlab/kampkit/Koin.kt b/shared/src/commonMain/kotlin/co/touchlab/kampkit/Koin.kt index db7c2df1..23e351e5 100644 --- a/shared/src/commonMain/kotlin/co/touchlab/kampkit/Koin.kt +++ b/shared/src/commonMain/kotlin/co/touchlab/kampkit/Koin.kt @@ -13,8 +13,10 @@ import org.koin.core.component.KoinComponent import org.koin.core.component.inject import org.koin.core.context.startKoin import org.koin.core.module.Module +import org.koin.core.module.dsl.singleOf import org.koin.core.parameter.parametersOf import org.koin.core.scope.Scope +import org.koin.dsl.bind import org.koin.dsl.module fun initKoin(appModule: Module): KoinApplication { @@ -40,7 +42,7 @@ fun initKoin(appModule: Module): KoinApplication { return koinApplication } -private val coreModule = module { +val coreModule = module { single { DatabaseHelper( get(), @@ -48,12 +50,9 @@ private val coreModule = module { Dispatchers.Default ) } - single { - DogApiImpl( - getWith("DogApiImpl"), - get() - ) - } + singleOf(::DogApiImpl) { + parametersOf("DogApiImpl") + } bind DogApi::class single { Clock.System } @@ -65,14 +64,8 @@ private val coreModule = module { val baseLogger = Logger(config = StaticConfig(logWriterList = listOf(platformLogWriter())), "KampKit") factory { (tag: String?) -> if (tag != null) baseLogger.withTag(tag) else baseLogger } - single { - BreedRepository( - get(), - get(), - get(), - getWith("BreedRepository"), - get() - ) + singleOf(::BreedRepository) { + parametersOf("BreedRepository") } } diff --git a/shared/src/iosMain/kotlin/co/touchlab/kampkit/KoinIOS.kt b/shared/src/iosMain/kotlin/co/touchlab/kampkit/KoinIOS.kt index 17fbbaa8..91fb7ba8 100644 --- a/shared/src/iosMain/kotlin/co/touchlab/kampkit/KoinIOS.kt +++ b/shared/src/iosMain/kotlin/co/touchlab/kampkit/KoinIOS.kt @@ -10,6 +10,7 @@ import io.ktor.client.engine.darwin.Darwin import org.koin.core.Koin import org.koin.core.KoinApplication import org.koin.core.component.KoinComponent +import org.koin.core.module.dsl.singleOf import org.koin.core.parameter.parametersOf import org.koin.dsl.module import platform.Foundation.NSUserDefaults @@ -31,7 +32,9 @@ actual val platformModule = module { single { Darwin.create() } - single { BreedCallbackViewModel(get(), getWith("BreedCallbackViewModel")) } + singleOf(::BreedCallbackViewModel) { + parametersOf("BreedCallbackViewModel") + } } // Access from Swift to create a logger diff --git a/shared/src/iosTest/kotlin/co/touchlab/kampkit/KoinTest.kt b/shared/src/iosTest/kotlin/co/touchlab/kampkit/KoinTest.kt index 99cf751d..08e746a2 100644 --- a/shared/src/iosTest/kotlin/co/touchlab/kampkit/KoinTest.kt +++ b/shared/src/iosTest/kotlin/co/touchlab/kampkit/KoinTest.kt @@ -1,9 +1,11 @@ package co.touchlab.kampkit import co.touchlab.kermit.Logger +import com.russhwolf.settings.NSUserDefaultsSettings +import com.russhwolf.settings.Settings import org.koin.core.context.stopKoin -import org.koin.core.parameter.parametersOf -import org.koin.test.check.checkModules +import org.koin.dsl.module +import org.koin.test.check.checkKoinModules import platform.Foundation.NSUserDefaults import kotlin.test.AfterTest import kotlin.test.Test @@ -11,13 +13,22 @@ import kotlin.test.Test class KoinTest { @Test fun checkAllModules() { - initKoinIos( - userDefaults = NSUserDefaults.standardUserDefaults, - appInfo = TestAppInfo, - doOnStartup = { } - ).checkModules { - withParameters { parametersOf("TestTag") } - } + val modules = listOf( + module { + single { NSUserDefaultsSettings(NSUserDefaults.standardUserDefaults) } + single { TestAppInfo } + single { } + }, + platformModule, + coreModule + ) + checkKoinModules( + modules = modules, + parameters = { + withParameter { "Test" } + withParameter { false } + } + ) } @AfterTest