Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Best-Practise-Docs#173] Use new Koin DSL where possible. #280

Draft
wants to merge 2 commits into
base: main
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 4 additions & 2 deletions app/src/main/java/co/touchlab/kampkit/android/MainApp.kt
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand All @@ -18,7 +18,9 @@ class MainApp : Application() {
initKoin(
module {
single<Context> { this@MainApp }
viewModel { BreedViewModel(get(), get { parametersOf("BreedViewModel") }) }
viewModelOf(::BreedViewModel) {
parametersOf("BreedViewModel")
}
single<SharedPreferences> {
get<Context>().getSharedPreferences("KAMPSTARTER_SETTINGS", Context.MODE_PRIVATE)
}
Expand Down
2 changes: 1 addition & 1 deletion gradle/libs.versions.toml
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand All @@ -18,9 +20,7 @@ actual val platformModule: Module = module {
)
}

single<Settings> {
SharedPreferencesSettings(get())
}
singleOf(::SharedPreferencesSettings) bind Settings::class

single {
OkHttp.create()
Expand Down
39 changes: 28 additions & 11 deletions shared/src/androidTest/kotlin/co/touchlab/kampkit/KoinTest.kt
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -21,18 +23,33 @@ import kotlin.test.Test
@Config(sdk = [32])
class KoinTest {

@OptIn(KoinExperimentalAPI::class)
@Test
fun checkAllModules() {
initKoin(
module {
single<Context> { getApplicationContext<Application>() }
single { get<Context>().getSharedPreferences("TEST", Context.MODE_PRIVATE) }
single<AppInfo> { TestAppInfo }
single { {} }
val testModule = module {
single<Context> { getApplicationContext<Application>() }
single<SharedPreferences> {
get<Context>().getSharedPreferences(
"TEST",
Context.MODE_PRIVATE
)
}
).checkModules {
withParameters<Logger> { parametersOf("TestTag") }
single<AppInfo> { TestAppInfo }
single { {} }

includes(
platformModule,
coreModule
)
}
testModule.verify(
extraTypes = listOf(
Boolean::class,
LoggerConfig::class,
String::class,
CoroutineDispatcher::class
)
)
}

@AfterTest
Expand Down
23 changes: 8 additions & 15 deletions shared/src/commonMain/kotlin/co/touchlab/kampkit/Koin.kt
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand All @@ -40,20 +42,17 @@ fun initKoin(appModule: Module): KoinApplication {
return koinApplication
}

private val coreModule = module {
val coreModule = module {
single {
DatabaseHelper(
get(),
getWith("DatabaseHelper"),
Dispatchers.Default
)
}
single<DogApi> {
DogApiImpl(
getWith("DogApiImpl"),
get()
)
}
singleOf(::DogApiImpl) {
parametersOf("DogApiImpl")
} bind DogApi::class
single<Clock> {
Clock.System
}
Expand All @@ -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")
}
}

Expand Down
5 changes: 4 additions & 1 deletion shared/src/iosMain/kotlin/co/touchlab/kampkit/KoinIOS.kt
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Expand Down
29 changes: 20 additions & 9 deletions shared/src/iosTest/kotlin/co/touchlab/kampkit/KoinTest.kt
Original file line number Diff line number Diff line change
@@ -1,23 +1,34 @@
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

class KoinTest {
@Test
fun checkAllModules() {
initKoinIos(
userDefaults = NSUserDefaults.standardUserDefaults,
appInfo = TestAppInfo,
doOnStartup = { }
).checkModules {
withParameters<Logger> { parametersOf("TestTag") }
}
val modules = listOf(
module {
single<Settings> { NSUserDefaultsSettings(NSUserDefaults.standardUserDefaults) }
single { TestAppInfo }
single { }
},
platformModule,
coreModule
)
checkKoinModules(
modules = modules,
parameters = {
withParameter<Logger> { "Test" }
withParameter<Settings> { false }
}
)
}

@AfterTest
Expand Down