From f84308087e598ead87f0ee5e1efcfc6175d463bf Mon Sep 17 00:00:00 2001 From: extmkv Date: Tue, 10 Sep 2024 09:33:58 +0200 Subject: [PATCH 1/3] Added support to KMP --- build.gradle.kts | 2 + gradle/libs.versions.toml | 37 ++++++++----- mvi-compose/build.gradle.kts | 5 +- mvi-sample/build.gradle.kts | 5 +- mvi/build.gradle.kts | 53 ++++++++++++++----- .../kotlin/com/adidas/mvi/Intent.kt | 0 .../kotlin/com/adidas/mvi/IntentExecutor.kt | 0 .../kotlin/com/adidas/mvi/Loggable.kt | 0 .../kotlin/com/adidas/mvi/LoggableState.kt | 0 .../kotlin/com/adidas/mvi/Logger.kt | 0 .../kotlin/com/adidas/mvi/Multimap.kt | 6 +-- .../kotlin/com/adidas/mvi/MviHost.kt | 0 .../kotlin/com/adidas/mvi/Reducer.kt | 0 .../kotlin/com/adidas/mvi/State.kt | 0 .../mvi/StateRequiredNotFulfilledException.kt | 0 .../adidas/mvi/TerminatedIntentException.kt | 2 +- .../adidas/mvi/reducer/ReducerExtensions.kt | 4 +- .../requirements/DoubleReduceRequirement.kt | 0 .../mvi/requirements/ReduceExtensions.kt | 0 .../mvi/requirements/ReduceRequirement.kt | 0 .../requirements/StateReduceRequirement.kt | 0 .../com/adidas/mvi/sideeffects/SideEffects.kt | 29 +++++----- .../com/adidas/mvi/transform/Operators.kt | 0 .../com/adidas/mvi/transform/Replace.kt | 0 .../mvi/transform/SideEffectTransform.kt | 0 .../adidas/mvi/transform/StateTransform.kt | 0 .../com/adidas/mvi/transform/ViewTransform.kt | 0 .../com/adidas/mvi/CoroutineListener.kt | 35 ++++++++++++ .../com/adidas/mvi/DispatchersContainer.kt | 0 .../adidas/mvi/FixedDispatchersContainer.kt | 0 .../kotlin/com/adidas/mvi/MultimapTests.kt | 2 +- .../product/FakeProductSideEffectTransform.kt | 0 .../mvi/product/FakeProductViewTransform.kt | 0 .../adidas/mvi/product/ProductSideEffect.kt | 0 .../com/adidas/mvi/product/ProductState.kt | 0 .../mvi/reducer/ReducerExtensionsTest.kt | 0 .../com/adidas/mvi/reducer/ReducerTests.kt | 2 +- .../reducer/TestCancellationReducerWrapper.kt | 0 .../com/adidas/mvi/reducer/TestIntent.kt | 0 .../com/adidas/mvi/reducer/TestSideEffect.kt | 0 .../com/adidas/mvi/reducer/TestState.kt | 0 .../com/adidas/mvi/reducer/TestTransform.kt | 0 .../mvi/reducer/logger/LoggerMatchers.kt | 0 .../adidas/mvi/reducer/logger/SpyLogger.kt | 1 - .../requirements/ReduceRequirementTests.kt | 0 .../adidas/mvi/sideeffects/SideEffectsTest.kt | 37 +++++++------ .../adidas/mvi/sideeffects/TestSideEffect.kt | 0 .../adidas/mvi/transform/OperatorsTests.kt | 0 .../com/adidas/mvi/transform/ReplaceTests.kt | 0 .../mvi/transform/SideEffectTransformTest.kt | 0 .../mvi/transform/StateTransformTest.kt | 0 .../com/adidas/mvi/CoroutineListener.kt | 27 ---------- settings.gradle.kts | 2 +- 53 files changed, 145 insertions(+), 104 deletions(-) rename mvi/src/{main => commonMain}/kotlin/com/adidas/mvi/Intent.kt (100%) rename mvi/src/{main => commonMain}/kotlin/com/adidas/mvi/IntentExecutor.kt (100%) rename mvi/src/{main => commonMain}/kotlin/com/adidas/mvi/Loggable.kt (100%) rename mvi/src/{main => commonMain}/kotlin/com/adidas/mvi/LoggableState.kt (100%) rename mvi/src/{main => commonMain}/kotlin/com/adidas/mvi/Logger.kt (100%) rename mvi/src/{main => commonMain}/kotlin/com/adidas/mvi/Multimap.kt (90%) rename mvi/src/{main => commonMain}/kotlin/com/adidas/mvi/MviHost.kt (100%) rename mvi/src/{main => commonMain}/kotlin/com/adidas/mvi/Reducer.kt (100%) rename mvi/src/{main => commonMain}/kotlin/com/adidas/mvi/State.kt (100%) rename mvi/src/{main => commonMain}/kotlin/com/adidas/mvi/StateRequiredNotFulfilledException.kt (100%) rename mvi/src/{main => commonMain}/kotlin/com/adidas/mvi/TerminatedIntentException.kt (86%) rename mvi/src/{main => commonMain}/kotlin/com/adidas/mvi/reducer/ReducerExtensions.kt (92%) rename mvi/src/{main => commonMain}/kotlin/com/adidas/mvi/requirements/DoubleReduceRequirement.kt (100%) rename mvi/src/{main => commonMain}/kotlin/com/adidas/mvi/requirements/ReduceExtensions.kt (100%) rename mvi/src/{main => commonMain}/kotlin/com/adidas/mvi/requirements/ReduceRequirement.kt (100%) rename mvi/src/{main => commonMain}/kotlin/com/adidas/mvi/requirements/StateReduceRequirement.kt (100%) rename mvi/src/{main => commonMain}/kotlin/com/adidas/mvi/sideeffects/SideEffects.kt (50%) rename mvi/src/{main => commonMain}/kotlin/com/adidas/mvi/transform/Operators.kt (100%) rename mvi/src/{main => commonMain}/kotlin/com/adidas/mvi/transform/Replace.kt (100%) rename mvi/src/{main => commonMain}/kotlin/com/adidas/mvi/transform/SideEffectTransform.kt (100%) rename mvi/src/{main => commonMain}/kotlin/com/adidas/mvi/transform/StateTransform.kt (100%) rename mvi/src/{main => commonMain}/kotlin/com/adidas/mvi/transform/ViewTransform.kt (100%) create mode 100644 mvi/src/commonTest/kotlin/com/adidas/mvi/CoroutineListener.kt rename mvi/src/{test => commonTest}/kotlin/com/adidas/mvi/DispatchersContainer.kt (100%) rename mvi/src/{test => commonTest}/kotlin/com/adidas/mvi/FixedDispatchersContainer.kt (100%) rename mvi/src/{test => commonTest}/kotlin/com/adidas/mvi/MultimapTests.kt (99%) rename mvi/src/{test => commonTest}/kotlin/com/adidas/mvi/product/FakeProductSideEffectTransform.kt (100%) rename mvi/src/{test => commonTest}/kotlin/com/adidas/mvi/product/FakeProductViewTransform.kt (100%) rename mvi/src/{test => commonTest}/kotlin/com/adidas/mvi/product/ProductSideEffect.kt (100%) rename mvi/src/{test => commonTest}/kotlin/com/adidas/mvi/product/ProductState.kt (100%) rename mvi/src/{test => commonTest}/kotlin/com/adidas/mvi/reducer/ReducerExtensionsTest.kt (100%) rename mvi/src/{test => commonTest}/kotlin/com/adidas/mvi/reducer/ReducerTests.kt (99%) rename mvi/src/{test => commonTest}/kotlin/com/adidas/mvi/reducer/TestCancellationReducerWrapper.kt (100%) rename mvi/src/{test => commonTest}/kotlin/com/adidas/mvi/reducer/TestIntent.kt (100%) rename mvi/src/{test => commonTest}/kotlin/com/adidas/mvi/reducer/TestSideEffect.kt (100%) rename mvi/src/{test => commonTest}/kotlin/com/adidas/mvi/reducer/TestState.kt (100%) rename mvi/src/{test => commonTest}/kotlin/com/adidas/mvi/reducer/TestTransform.kt (100%) rename mvi/src/{test => commonTest}/kotlin/com/adidas/mvi/reducer/logger/LoggerMatchers.kt (100%) rename mvi/src/{test => commonTest}/kotlin/com/adidas/mvi/reducer/logger/SpyLogger.kt (98%) rename mvi/src/{test => commonTest}/kotlin/com/adidas/mvi/requirements/ReduceRequirementTests.kt (100%) rename mvi/src/{test => commonTest}/kotlin/com/adidas/mvi/sideeffects/SideEffectsTest.kt (78%) rename mvi/src/{test => commonTest}/kotlin/com/adidas/mvi/sideeffects/TestSideEffect.kt (100%) rename mvi/src/{test => commonTest}/kotlin/com/adidas/mvi/transform/OperatorsTests.kt (100%) rename mvi/src/{test => commonTest}/kotlin/com/adidas/mvi/transform/ReplaceTests.kt (100%) rename mvi/src/{test => commonTest}/kotlin/com/adidas/mvi/transform/SideEffectTransformTest.kt (100%) rename mvi/src/{test => commonTest}/kotlin/com/adidas/mvi/transform/StateTransformTest.kt (100%) delete mode 100644 mvi/src/test/kotlin/com/adidas/mvi/CoroutineListener.kt diff --git a/build.gradle.kts b/build.gradle.kts index 2d3f0fb..392e606 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -13,6 +13,8 @@ plugins { alias(libs.plugins.kotlin) apply false alias(libs.plugins.kotlin.android) apply false alias(libs.plugins.android.library) apply false + alias(libs.plugins.kotlinMultiplatform) apply false + alias(libs.plugins.compose.compiler) apply false alias(libs.plugins.mavenPublish) } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 40d4072..463bfcc 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,24 +1,25 @@ [versions] -ksp = "1.9.23-1.0.19" -appcompat = "1.6.1" -koin = "3.5.3" +ksp = "2.0.20-1.0.25" +appcompat = "1.7.0" +koin = "3.5.6" koin-annotations = "1.3.1" -koin-android = "3.5.3" -koin-compose = "3.5.3" -kotlin = "1.9.23" -coroutines = "1.8.0" -kotest = "5.8.1" -material = "1.6.5" +koin-android = "3.5.6" +koin-compose = "3.5.6" +kotlin = "2.0.0" +coroutines = "1.8.1" +kotest = "5.9.0" +material = "1.7.0" mvi = "1.7.0" mvi-compose = "0.0.3" -activity = "1.8.2" -lifecycle = "2.7.0" +activity = "1.9.2" +lifecycle = "2.8.5" ktlint-gradle = "12.1.0" -android-library = "8.3.1" +android-library = "8.3.2" maven-publish = "0.25.2" -ui = "1.6.5" -mockk = "1.13.10" +ui = "1.7.0" +mockk = "1.13.11" mvi-kotest = "0.0.2" + # its beeing used outside this file ktlint-lib = "1.2.1" @@ -26,7 +27,9 @@ ktlint-lib = "1.2.1" appcompat = { module = "androidx.appcompat:appcompat", version.ref = "appcompat" } coroutinesCore = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-core", version.ref = "coroutines" } coroutinesTest = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-test", version.ref = "coroutines" } +kotest-framework-engine = { module = "io.kotest:kotest-framework-engine", version.ref = "kotest" } kotestRunner = { module = "io.kotest:kotest-runner-junit5", version.ref = "kotest" } +kotest-assertions = { module = "io.kotest:kotest-assertions-core", version.ref = "kotest" } kotlinBom = { module = "org.jetbrains.kotlin:kotlin-bom", version.ref = "kotlin" } mvi = { module = "com.adidas.mvi:mvi", version.ref = "mvi" } mviCompose = { module = "com.adidas.mvi:mvi-compose", version.ref = "mvi-compose" } @@ -49,3 +52,9 @@ mavenPublish = { id = "com.vanniktech.maven.publish", version.ref = "maven-publi android-library = { id = "com.android.library", version.ref = "android-library" } kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" } ksp = { id = "com.google.devtools.ksp", version.ref = "ksp" } +kotlinMultiplatform = { id = "org.jetbrains.kotlin.multiplatform", version.ref = "kotlin" } +kotest = { id = "io.kotest.multiplatform", version.ref = "kotest" } +atomicfu = { id = "org.jetbrains.kotlinx.atomicfu", version = "0.25.0" } +compose-compiler = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin" } + + diff --git a/mvi-compose/build.gradle.kts b/mvi-compose/build.gradle.kts index 3acadd0..485b9f9 100644 --- a/mvi-compose/build.gradle.kts +++ b/mvi-compose/build.gradle.kts @@ -2,6 +2,7 @@ plugins { alias(libs.plugins.android.library) alias(libs.plugins.kotlin.android) alias(libs.plugins.mavenPublish) + alias(libs.plugins.compose.compiler) } kotlin { @@ -39,10 +40,6 @@ android { buildFeatures { compose = true } - - composeOptions { - kotlinCompilerExtensionVersion = "1.5.11" - } } dependencies { diff --git a/mvi-sample/build.gradle.kts b/mvi-sample/build.gradle.kts index 10ae026..be9e238 100644 --- a/mvi-sample/build.gradle.kts +++ b/mvi-sample/build.gradle.kts @@ -7,6 +7,7 @@ plugins { id("kotlin-android") id("kotlin-kapt") alias(libs.plugins.ksp) + alias(libs.plugins.compose.compiler) } android { @@ -37,10 +38,6 @@ android { jvmTarget = JavaVersion.VERSION_17.toString() } - composeOptions { - kotlinCompilerExtensionVersion = "1.5.11" - } - buildFeatures { compose = true } diff --git a/mvi/build.gradle.kts b/mvi/build.gradle.kts index 9df3c47..974ff3d 100644 --- a/mvi/build.gradle.kts +++ b/mvi/build.gradle.kts @@ -1,31 +1,56 @@ import org.jlleitschuh.gradle.ktlint.KtlintExtension plugins { - kotlin("jvm") version libs.versions.kotlin.get() + alias(libs.plugins.kotlinMultiplatform) alias(libs.plugins.ktlint) alias(libs.plugins.mavenPublish) + alias(libs.plugins.kotest) + alias(libs.plugins.atomicfu) } kotlin { explicitApi() -} -val compileTestKotlin: org.jetbrains.kotlin.gradle.tasks.KotlinCompile by tasks -compileTestKotlin.kotlinOptions { - freeCompilerArgs += "-Xuse-experimental=kotlinx.coroutines.ExperimentalCoroutinesApi" + jvm { + withJava() + } + iosX64() + iosArm64() + iosSimulatorArm64() + macosX64() + macosArm64() + watchosArm32() + watchosArm64() + watchosDeviceArm64() + watchosSimulatorArm64() + watchosX64() + tvosArm64() + tvosSimulatorArm64() + tvosX64() + + sourceSets { + commonMain.dependencies { + implementation(libs.coroutinesCore) + } + + commonTest.dependencies { + implementation(libs.kotest.framework.engine) + implementation(libs.kotest.assertions) + implementation(libs.coroutinesTest) + } + + jvmTest.dependencies { + implementation(libs.kotestRunner) + } + } } configure { version.set(libs.versions.ktlint.lib.get()) } -tasks.getByName("test") { - useJUnitPlatform() -} - -dependencies { - implementation(libs.coroutinesCore) - - testImplementation(libs.kotestRunner) - testImplementation(libs.coroutinesTest) +tasks { + withType { + useJUnitPlatform() + } } diff --git a/mvi/src/main/kotlin/com/adidas/mvi/Intent.kt b/mvi/src/commonMain/kotlin/com/adidas/mvi/Intent.kt similarity index 100% rename from mvi/src/main/kotlin/com/adidas/mvi/Intent.kt rename to mvi/src/commonMain/kotlin/com/adidas/mvi/Intent.kt diff --git a/mvi/src/main/kotlin/com/adidas/mvi/IntentExecutor.kt b/mvi/src/commonMain/kotlin/com/adidas/mvi/IntentExecutor.kt similarity index 100% rename from mvi/src/main/kotlin/com/adidas/mvi/IntentExecutor.kt rename to mvi/src/commonMain/kotlin/com/adidas/mvi/IntentExecutor.kt diff --git a/mvi/src/main/kotlin/com/adidas/mvi/Loggable.kt b/mvi/src/commonMain/kotlin/com/adidas/mvi/Loggable.kt similarity index 100% rename from mvi/src/main/kotlin/com/adidas/mvi/Loggable.kt rename to mvi/src/commonMain/kotlin/com/adidas/mvi/Loggable.kt diff --git a/mvi/src/main/kotlin/com/adidas/mvi/LoggableState.kt b/mvi/src/commonMain/kotlin/com/adidas/mvi/LoggableState.kt similarity index 100% rename from mvi/src/main/kotlin/com/adidas/mvi/LoggableState.kt rename to mvi/src/commonMain/kotlin/com/adidas/mvi/LoggableState.kt diff --git a/mvi/src/main/kotlin/com/adidas/mvi/Logger.kt b/mvi/src/commonMain/kotlin/com/adidas/mvi/Logger.kt similarity index 100% rename from mvi/src/main/kotlin/com/adidas/mvi/Logger.kt rename to mvi/src/commonMain/kotlin/com/adidas/mvi/Logger.kt diff --git a/mvi/src/main/kotlin/com/adidas/mvi/Multimap.kt b/mvi/src/commonMain/kotlin/com/adidas/mvi/Multimap.kt similarity index 90% rename from mvi/src/main/kotlin/com/adidas/mvi/Multimap.kt rename to mvi/src/commonMain/kotlin/com/adidas/mvi/Multimap.kt index aec0b1b..31aed49 100644 --- a/mvi/src/main/kotlin/com/adidas/mvi/Multimap.kt +++ b/mvi/src/commonMain/kotlin/com/adidas/mvi/Multimap.kt @@ -1,13 +1,12 @@ package com.adidas.mvi -import java.util.Collections import kotlin.reflect.KClass internal class Multimap { private val innerMap = hashMapOf>>() val keys: Collection - get() = Collections.unmodifiableSet(innerMap.keys) + get() = innerMap.keys.toSet() fun put( key: TKey, @@ -29,7 +28,8 @@ internal class Multimap { innerMap[key] = MutableList(values.size) { values[it] } } - operator fun get(key: TKey): List> = innerMap[key]?.let(Collections::unmodifiableList) ?: listOf() + operator fun get(key: TKey): List> = + innerMap[key]?.toList() ?: listOf() operator fun get(keyClass: KClass): List> = keys diff --git a/mvi/src/main/kotlin/com/adidas/mvi/MviHost.kt b/mvi/src/commonMain/kotlin/com/adidas/mvi/MviHost.kt similarity index 100% rename from mvi/src/main/kotlin/com/adidas/mvi/MviHost.kt rename to mvi/src/commonMain/kotlin/com/adidas/mvi/MviHost.kt diff --git a/mvi/src/main/kotlin/com/adidas/mvi/Reducer.kt b/mvi/src/commonMain/kotlin/com/adidas/mvi/Reducer.kt similarity index 100% rename from mvi/src/main/kotlin/com/adidas/mvi/Reducer.kt rename to mvi/src/commonMain/kotlin/com/adidas/mvi/Reducer.kt diff --git a/mvi/src/main/kotlin/com/adidas/mvi/State.kt b/mvi/src/commonMain/kotlin/com/adidas/mvi/State.kt similarity index 100% rename from mvi/src/main/kotlin/com/adidas/mvi/State.kt rename to mvi/src/commonMain/kotlin/com/adidas/mvi/State.kt diff --git a/mvi/src/main/kotlin/com/adidas/mvi/StateRequiredNotFulfilledException.kt b/mvi/src/commonMain/kotlin/com/adidas/mvi/StateRequiredNotFulfilledException.kt similarity index 100% rename from mvi/src/main/kotlin/com/adidas/mvi/StateRequiredNotFulfilledException.kt rename to mvi/src/commonMain/kotlin/com/adidas/mvi/StateRequiredNotFulfilledException.kt diff --git a/mvi/src/main/kotlin/com/adidas/mvi/TerminatedIntentException.kt b/mvi/src/commonMain/kotlin/com/adidas/mvi/TerminatedIntentException.kt similarity index 86% rename from mvi/src/main/kotlin/com/adidas/mvi/TerminatedIntentException.kt rename to mvi/src/commonMain/kotlin/com/adidas/mvi/TerminatedIntentException.kt index 914ebbf..0119ef3 100644 --- a/mvi/src/main/kotlin/com/adidas/mvi/TerminatedIntentException.kt +++ b/mvi/src/commonMain/kotlin/com/adidas/mvi/TerminatedIntentException.kt @@ -2,4 +2,4 @@ package com.adidas.mvi import kotlinx.coroutines.CancellationException -internal class TerminatedIntentException : CancellationException() +internal class TerminatedIntentException : CancellationException("Terminated intent") diff --git a/mvi/src/main/kotlin/com/adidas/mvi/reducer/ReducerExtensions.kt b/mvi/src/commonMain/kotlin/com/adidas/mvi/reducer/ReducerExtensions.kt similarity index 92% rename from mvi/src/main/kotlin/com/adidas/mvi/reducer/ReducerExtensions.kt rename to mvi/src/commonMain/kotlin/com/adidas/mvi/reducer/ReducerExtensions.kt index adfea9c..9f3c89a 100644 --- a/mvi/src/main/kotlin/com/adidas/mvi/reducer/ReducerExtensions.kt +++ b/mvi/src/commonMain/kotlin/com/adidas/mvi/reducer/ReducerExtensions.kt @@ -30,7 +30,7 @@ public fun Reducer( @Suppress("UNCHECKED_CAST") public inline fun Reducer<*, *>.requireView(): TView = (state.value as State).view.apply { - if (this.javaClass != TView::class.java) { - throw ClassCastException("Required view of ${TView::class.java} type, but found ${this.javaClass}") + if (!TView::class.isInstance(this)) { + throw ClassCastException("Required view of ${TView::class} type, but found ${this}") } } diff --git a/mvi/src/main/kotlin/com/adidas/mvi/requirements/DoubleReduceRequirement.kt b/mvi/src/commonMain/kotlin/com/adidas/mvi/requirements/DoubleReduceRequirement.kt similarity index 100% rename from mvi/src/main/kotlin/com/adidas/mvi/requirements/DoubleReduceRequirement.kt rename to mvi/src/commonMain/kotlin/com/adidas/mvi/requirements/DoubleReduceRequirement.kt diff --git a/mvi/src/main/kotlin/com/adidas/mvi/requirements/ReduceExtensions.kt b/mvi/src/commonMain/kotlin/com/adidas/mvi/requirements/ReduceExtensions.kt similarity index 100% rename from mvi/src/main/kotlin/com/adidas/mvi/requirements/ReduceExtensions.kt rename to mvi/src/commonMain/kotlin/com/adidas/mvi/requirements/ReduceExtensions.kt diff --git a/mvi/src/main/kotlin/com/adidas/mvi/requirements/ReduceRequirement.kt b/mvi/src/commonMain/kotlin/com/adidas/mvi/requirements/ReduceRequirement.kt similarity index 100% rename from mvi/src/main/kotlin/com/adidas/mvi/requirements/ReduceRequirement.kt rename to mvi/src/commonMain/kotlin/com/adidas/mvi/requirements/ReduceRequirement.kt diff --git a/mvi/src/main/kotlin/com/adidas/mvi/requirements/StateReduceRequirement.kt b/mvi/src/commonMain/kotlin/com/adidas/mvi/requirements/StateReduceRequirement.kt similarity index 100% rename from mvi/src/main/kotlin/com/adidas/mvi/requirements/StateReduceRequirement.kt rename to mvi/src/commonMain/kotlin/com/adidas/mvi/requirements/StateReduceRequirement.kt diff --git a/mvi/src/main/kotlin/com/adidas/mvi/sideeffects/SideEffects.kt b/mvi/src/commonMain/kotlin/com/adidas/mvi/sideeffects/SideEffects.kt similarity index 50% rename from mvi/src/main/kotlin/com/adidas/mvi/sideeffects/SideEffects.kt rename to mvi/src/commonMain/kotlin/com/adidas/mvi/sideeffects/SideEffects.kt index 3b36754..1c6b2c5 100644 --- a/mvi/src/main/kotlin/com/adidas/mvi/sideeffects/SideEffects.kt +++ b/mvi/src/commonMain/kotlin/com/adidas/mvi/sideeffects/SideEffects.kt @@ -1,33 +1,38 @@ package com.adidas.mvi.sideeffects -import java.util.LinkedList -import java.util.Queue +import kotlinx.atomicfu.AtomicRef +import kotlinx.atomicfu.atomic /** * A thread-safe side effect container * It only returns each SideEffect once, if you use it as an [Iterable] it will emit each SideEffect and remove them so it's a perfect case for one shot SideEffects. * It locks itself, so you can't add and read at the same time, also it's not possible to read it at the same time from different threads, being completely thread-safe. */ + public class SideEffects() : Iterable { - private val sideEffects: Queue = LinkedList() + private val sideEffects: AtomicRef> = atomic(ArrayList()) + // Private constructor to initialize from an Iterable private constructor(sideEffects: Iterable) : this() { - this.sideEffects.addAll(sideEffects) + this.sideEffects.value.addAll(sideEffects) } public fun add(vararg sideEffectsToAdd: T): SideEffects { - return SideEffects(sideEffects + sideEffectsToAdd) + val newList = sideEffects.value.toMutableList() + newList.addAll(sideEffectsToAdd) + return SideEffects(newList) } public fun clear(): SideEffects { return SideEffects() } - override fun iterator(): Iterator = - iterator { - do { - val nextSideEffect: T? = sideEffects.poll() - nextSideEffect?.let { yield(it) } - } while (nextSideEffect != null) + override fun iterator(): Iterator = iterator { + while (true) { + val currentList = sideEffects.value + if (currentList.isEmpty()) break + val nextSideEffect = currentList.removeFirstOrNull() + nextSideEffect?.let { yield(it) } } -} + } +} \ No newline at end of file diff --git a/mvi/src/main/kotlin/com/adidas/mvi/transform/Operators.kt b/mvi/src/commonMain/kotlin/com/adidas/mvi/transform/Operators.kt similarity index 100% rename from mvi/src/main/kotlin/com/adidas/mvi/transform/Operators.kt rename to mvi/src/commonMain/kotlin/com/adidas/mvi/transform/Operators.kt diff --git a/mvi/src/main/kotlin/com/adidas/mvi/transform/Replace.kt b/mvi/src/commonMain/kotlin/com/adidas/mvi/transform/Replace.kt similarity index 100% rename from mvi/src/main/kotlin/com/adidas/mvi/transform/Replace.kt rename to mvi/src/commonMain/kotlin/com/adidas/mvi/transform/Replace.kt diff --git a/mvi/src/main/kotlin/com/adidas/mvi/transform/SideEffectTransform.kt b/mvi/src/commonMain/kotlin/com/adidas/mvi/transform/SideEffectTransform.kt similarity index 100% rename from mvi/src/main/kotlin/com/adidas/mvi/transform/SideEffectTransform.kt rename to mvi/src/commonMain/kotlin/com/adidas/mvi/transform/SideEffectTransform.kt diff --git a/mvi/src/main/kotlin/com/adidas/mvi/transform/StateTransform.kt b/mvi/src/commonMain/kotlin/com/adidas/mvi/transform/StateTransform.kt similarity index 100% rename from mvi/src/main/kotlin/com/adidas/mvi/transform/StateTransform.kt rename to mvi/src/commonMain/kotlin/com/adidas/mvi/transform/StateTransform.kt diff --git a/mvi/src/main/kotlin/com/adidas/mvi/transform/ViewTransform.kt b/mvi/src/commonMain/kotlin/com/adidas/mvi/transform/ViewTransform.kt similarity index 100% rename from mvi/src/main/kotlin/com/adidas/mvi/transform/ViewTransform.kt rename to mvi/src/commonMain/kotlin/com/adidas/mvi/transform/ViewTransform.kt diff --git a/mvi/src/commonTest/kotlin/com/adidas/mvi/CoroutineListener.kt b/mvi/src/commonTest/kotlin/com/adidas/mvi/CoroutineListener.kt new file mode 100644 index 0000000..e7f947b --- /dev/null +++ b/mvi/src/commonTest/kotlin/com/adidas/mvi/CoroutineListener.kt @@ -0,0 +1,35 @@ +package com.adidas.mvi + +import io.kotest.core.listeners.TestListener +import io.kotest.core.test.TestCase +import io.kotest.core.test.TestResult +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.cancel +import kotlinx.coroutines.test.TestCoroutineScheduler +import kotlinx.coroutines.test.TestDispatcher +import kotlinx.coroutines.test.UnconfinedTestDispatcher +import kotlinx.coroutines.test.resetMain +import kotlinx.coroutines.test.setMain + +internal class CoroutineListener( + internal val testCoroutineDispatcher: TestDispatcher = UnconfinedTestDispatcher( + TestCoroutineScheduler() + ), +) : TestListener { + + internal val dispatchersContainer: DispatchersContainer = + FixedDispatchersContainer(testCoroutineDispatcher) + + override suspend fun beforeContainer(testCase: TestCase) { + Dispatchers.setMain(testCoroutineDispatcher) + } + + override suspend fun afterContainer(testCase: TestCase, result: TestResult) { + Dispatchers.resetMain() + testCoroutineDispatcher.scheduler.cancel() + } + + public fun advanceUntilIdle() { + testCoroutineDispatcher.scheduler.advanceUntilIdle() + } +} diff --git a/mvi/src/test/kotlin/com/adidas/mvi/DispatchersContainer.kt b/mvi/src/commonTest/kotlin/com/adidas/mvi/DispatchersContainer.kt similarity index 100% rename from mvi/src/test/kotlin/com/adidas/mvi/DispatchersContainer.kt rename to mvi/src/commonTest/kotlin/com/adidas/mvi/DispatchersContainer.kt diff --git a/mvi/src/test/kotlin/com/adidas/mvi/FixedDispatchersContainer.kt b/mvi/src/commonTest/kotlin/com/adidas/mvi/FixedDispatchersContainer.kt similarity index 100% rename from mvi/src/test/kotlin/com/adidas/mvi/FixedDispatchersContainer.kt rename to mvi/src/commonTest/kotlin/com/adidas/mvi/FixedDispatchersContainer.kt diff --git a/mvi/src/test/kotlin/com/adidas/mvi/MultimapTests.kt b/mvi/src/commonTest/kotlin/com/adidas/mvi/MultimapTests.kt similarity index 99% rename from mvi/src/test/kotlin/com/adidas/mvi/MultimapTests.kt rename to mvi/src/commonTest/kotlin/com/adidas/mvi/MultimapTests.kt index dbd0b55..fbb3a2f 100644 --- a/mvi/src/test/kotlin/com/adidas/mvi/MultimapTests.kt +++ b/mvi/src/commonTest/kotlin/com/adidas/mvi/MultimapTests.kt @@ -117,4 +117,4 @@ internal class MultimapTests : BehaviorSpec({ } } } -}) +}) \ No newline at end of file diff --git a/mvi/src/test/kotlin/com/adidas/mvi/product/FakeProductSideEffectTransform.kt b/mvi/src/commonTest/kotlin/com/adidas/mvi/product/FakeProductSideEffectTransform.kt similarity index 100% rename from mvi/src/test/kotlin/com/adidas/mvi/product/FakeProductSideEffectTransform.kt rename to mvi/src/commonTest/kotlin/com/adidas/mvi/product/FakeProductSideEffectTransform.kt diff --git a/mvi/src/test/kotlin/com/adidas/mvi/product/FakeProductViewTransform.kt b/mvi/src/commonTest/kotlin/com/adidas/mvi/product/FakeProductViewTransform.kt similarity index 100% rename from mvi/src/test/kotlin/com/adidas/mvi/product/FakeProductViewTransform.kt rename to mvi/src/commonTest/kotlin/com/adidas/mvi/product/FakeProductViewTransform.kt diff --git a/mvi/src/test/kotlin/com/adidas/mvi/product/ProductSideEffect.kt b/mvi/src/commonTest/kotlin/com/adidas/mvi/product/ProductSideEffect.kt similarity index 100% rename from mvi/src/test/kotlin/com/adidas/mvi/product/ProductSideEffect.kt rename to mvi/src/commonTest/kotlin/com/adidas/mvi/product/ProductSideEffect.kt diff --git a/mvi/src/test/kotlin/com/adidas/mvi/product/ProductState.kt b/mvi/src/commonTest/kotlin/com/adidas/mvi/product/ProductState.kt similarity index 100% rename from mvi/src/test/kotlin/com/adidas/mvi/product/ProductState.kt rename to mvi/src/commonTest/kotlin/com/adidas/mvi/product/ProductState.kt diff --git a/mvi/src/test/kotlin/com/adidas/mvi/reducer/ReducerExtensionsTest.kt b/mvi/src/commonTest/kotlin/com/adidas/mvi/reducer/ReducerExtensionsTest.kt similarity index 100% rename from mvi/src/test/kotlin/com/adidas/mvi/reducer/ReducerExtensionsTest.kt rename to mvi/src/commonTest/kotlin/com/adidas/mvi/reducer/ReducerExtensionsTest.kt diff --git a/mvi/src/test/kotlin/com/adidas/mvi/reducer/ReducerTests.kt b/mvi/src/commonTest/kotlin/com/adidas/mvi/reducer/ReducerTests.kt similarity index 99% rename from mvi/src/test/kotlin/com/adidas/mvi/reducer/ReducerTests.kt rename to mvi/src/commonTest/kotlin/com/adidas/mvi/reducer/ReducerTests.kt index 24961bd..291e5b7 100644 --- a/mvi/src/test/kotlin/com/adidas/mvi/reducer/ReducerTests.kt +++ b/mvi/src/commonTest/kotlin/com/adidas/mvi/reducer/ReducerTests.kt @@ -198,7 +198,7 @@ private fun createIntentExecutorContainer( } private fun createIntentExecutorContainer( - exception: java.lang.Exception, + exception: Throwable, ): (TestIntent) -> Flow>> = { if (it is TestIntent.SimpleIntent) throw exception diff --git a/mvi/src/test/kotlin/com/adidas/mvi/reducer/TestCancellationReducerWrapper.kt b/mvi/src/commonTest/kotlin/com/adidas/mvi/reducer/TestCancellationReducerWrapper.kt similarity index 100% rename from mvi/src/test/kotlin/com/adidas/mvi/reducer/TestCancellationReducerWrapper.kt rename to mvi/src/commonTest/kotlin/com/adidas/mvi/reducer/TestCancellationReducerWrapper.kt diff --git a/mvi/src/test/kotlin/com/adidas/mvi/reducer/TestIntent.kt b/mvi/src/commonTest/kotlin/com/adidas/mvi/reducer/TestIntent.kt similarity index 100% rename from mvi/src/test/kotlin/com/adidas/mvi/reducer/TestIntent.kt rename to mvi/src/commonTest/kotlin/com/adidas/mvi/reducer/TestIntent.kt diff --git a/mvi/src/test/kotlin/com/adidas/mvi/reducer/TestSideEffect.kt b/mvi/src/commonTest/kotlin/com/adidas/mvi/reducer/TestSideEffect.kt similarity index 100% rename from mvi/src/test/kotlin/com/adidas/mvi/reducer/TestSideEffect.kt rename to mvi/src/commonTest/kotlin/com/adidas/mvi/reducer/TestSideEffect.kt diff --git a/mvi/src/test/kotlin/com/adidas/mvi/reducer/TestState.kt b/mvi/src/commonTest/kotlin/com/adidas/mvi/reducer/TestState.kt similarity index 100% rename from mvi/src/test/kotlin/com/adidas/mvi/reducer/TestState.kt rename to mvi/src/commonTest/kotlin/com/adidas/mvi/reducer/TestState.kt diff --git a/mvi/src/test/kotlin/com/adidas/mvi/reducer/TestTransform.kt b/mvi/src/commonTest/kotlin/com/adidas/mvi/reducer/TestTransform.kt similarity index 100% rename from mvi/src/test/kotlin/com/adidas/mvi/reducer/TestTransform.kt rename to mvi/src/commonTest/kotlin/com/adidas/mvi/reducer/TestTransform.kt diff --git a/mvi/src/test/kotlin/com/adidas/mvi/reducer/logger/LoggerMatchers.kt b/mvi/src/commonTest/kotlin/com/adidas/mvi/reducer/logger/LoggerMatchers.kt similarity index 100% rename from mvi/src/test/kotlin/com/adidas/mvi/reducer/logger/LoggerMatchers.kt rename to mvi/src/commonTest/kotlin/com/adidas/mvi/reducer/logger/LoggerMatchers.kt diff --git a/mvi/src/test/kotlin/com/adidas/mvi/reducer/logger/SpyLogger.kt b/mvi/src/commonTest/kotlin/com/adidas/mvi/reducer/logger/SpyLogger.kt similarity index 98% rename from mvi/src/test/kotlin/com/adidas/mvi/reducer/logger/SpyLogger.kt rename to mvi/src/commonTest/kotlin/com/adidas/mvi/reducer/logger/SpyLogger.kt index b1439be..3bcde9f 100644 --- a/mvi/src/test/kotlin/com/adidas/mvi/reducer/logger/SpyLogger.kt +++ b/mvi/src/commonTest/kotlin/com/adidas/mvi/reducer/logger/SpyLogger.kt @@ -2,7 +2,6 @@ package com.adidas.mvi.reducer.logger import com.adidas.mvi.Loggable import com.adidas.mvi.Logger -import java.lang.StringBuilder private const val SPACE = " " internal const val SUCCESSFUL_INTENT = "SuccessfulIntent:" diff --git a/mvi/src/test/kotlin/com/adidas/mvi/requirements/ReduceRequirementTests.kt b/mvi/src/commonTest/kotlin/com/adidas/mvi/requirements/ReduceRequirementTests.kt similarity index 100% rename from mvi/src/test/kotlin/com/adidas/mvi/requirements/ReduceRequirementTests.kt rename to mvi/src/commonTest/kotlin/com/adidas/mvi/requirements/ReduceRequirementTests.kt diff --git a/mvi/src/test/kotlin/com/adidas/mvi/sideeffects/SideEffectsTest.kt b/mvi/src/commonTest/kotlin/com/adidas/mvi/sideeffects/SideEffectsTest.kt similarity index 78% rename from mvi/src/test/kotlin/com/adidas/mvi/sideeffects/SideEffectsTest.kt rename to mvi/src/commonTest/kotlin/com/adidas/mvi/sideeffects/SideEffectsTest.kt index 0013a78..d6994a7 100644 --- a/mvi/src/test/kotlin/com/adidas/mvi/sideeffects/SideEffectsTest.kt +++ b/mvi/src/commonTest/kotlin/com/adidas/mvi/sideeffects/SideEffectsTest.kt @@ -5,8 +5,9 @@ import io.kotest.matchers.booleans.shouldBeFalse import io.kotest.matchers.collections.shouldBeEmpty import io.kotest.matchers.collections.shouldContain import io.kotest.matchers.collections.shouldContainInOrder -import java.util.concurrent.Semaphore -import kotlin.concurrent.thread +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import kotlinx.coroutines.sync.Semaphore import kotlin.time.DurationUnit import kotlin.time.ExperimentalTime import kotlin.time.toDuration @@ -66,33 +67,31 @@ internal class SideEffectsTest : BehaviorSpec({ var returnedSideEffects = sideEffects.add(firstSideEffect) - val semaphore = Semaphore(0) + val semaphore = Semaphore(2) - val readThread = - thread { - returnedSideEffects.forEach { _ -> - semaphore.acquire() - } + val readJob = launch(Dispatchers.Default) { + returnedSideEffects.forEach { _ -> + semaphore.acquire() // Wait for the signal } + } - val addThread = - thread { - returnedSideEffects = returnedSideEffects.add(secondSideEffectToBeAddedLater) - } + val addJob = launch(Dispatchers.Default) { + returnedSideEffects = sideEffects.add(secondSideEffectToBeAddedLater) + } semaphore.release() then("It should be released only by the semaphore").config( timeout = - 5.toDuration( - DurationUnit.SECONDS, - ), + 5.toDuration( + DurationUnit.SECONDS, + ), ) { - readThread.join() - addThread.join() + readJob.join() + addJob.join() - readThread.isAlive.shouldBeFalse() - addThread.isAlive.shouldBeFalse() + readJob.isActive.shouldBeFalse() + addJob.isActive.shouldBeFalse() returnedSideEffects.shouldContain(secondSideEffectToBeAddedLater) } } diff --git a/mvi/src/test/kotlin/com/adidas/mvi/sideeffects/TestSideEffect.kt b/mvi/src/commonTest/kotlin/com/adidas/mvi/sideeffects/TestSideEffect.kt similarity index 100% rename from mvi/src/test/kotlin/com/adidas/mvi/sideeffects/TestSideEffect.kt rename to mvi/src/commonTest/kotlin/com/adidas/mvi/sideeffects/TestSideEffect.kt diff --git a/mvi/src/test/kotlin/com/adidas/mvi/transform/OperatorsTests.kt b/mvi/src/commonTest/kotlin/com/adidas/mvi/transform/OperatorsTests.kt similarity index 100% rename from mvi/src/test/kotlin/com/adidas/mvi/transform/OperatorsTests.kt rename to mvi/src/commonTest/kotlin/com/adidas/mvi/transform/OperatorsTests.kt diff --git a/mvi/src/test/kotlin/com/adidas/mvi/transform/ReplaceTests.kt b/mvi/src/commonTest/kotlin/com/adidas/mvi/transform/ReplaceTests.kt similarity index 100% rename from mvi/src/test/kotlin/com/adidas/mvi/transform/ReplaceTests.kt rename to mvi/src/commonTest/kotlin/com/adidas/mvi/transform/ReplaceTests.kt diff --git a/mvi/src/test/kotlin/com/adidas/mvi/transform/SideEffectTransformTest.kt b/mvi/src/commonTest/kotlin/com/adidas/mvi/transform/SideEffectTransformTest.kt similarity index 100% rename from mvi/src/test/kotlin/com/adidas/mvi/transform/SideEffectTransformTest.kt rename to mvi/src/commonTest/kotlin/com/adidas/mvi/transform/SideEffectTransformTest.kt diff --git a/mvi/src/test/kotlin/com/adidas/mvi/transform/StateTransformTest.kt b/mvi/src/commonTest/kotlin/com/adidas/mvi/transform/StateTransformTest.kt similarity index 100% rename from mvi/src/test/kotlin/com/adidas/mvi/transform/StateTransformTest.kt rename to mvi/src/commonTest/kotlin/com/adidas/mvi/transform/StateTransformTest.kt diff --git a/mvi/src/test/kotlin/com/adidas/mvi/CoroutineListener.kt b/mvi/src/test/kotlin/com/adidas/mvi/CoroutineListener.kt deleted file mode 100644 index 44db1e2..0000000 --- a/mvi/src/test/kotlin/com/adidas/mvi/CoroutineListener.kt +++ /dev/null @@ -1,27 +0,0 @@ -package com.adidas.mvi - -import io.kotest.core.listeners.TestListener -import io.kotest.core.test.TestCase -import io.kotest.core.test.TestResult -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.test.TestCoroutineDispatcher -import kotlinx.coroutines.test.resetMain -import kotlinx.coroutines.test.setMain - -internal class CoroutineListener( - internal val testCoroutineDispatcher: TestCoroutineDispatcher = TestCoroutineDispatcher(), -) : TestListener { - internal val dispatchersContainer: DispatchersContainer = FixedDispatchersContainer(testCoroutineDispatcher) - - override suspend fun beforeContainer(testCase: TestCase) { - Dispatchers.setMain(testCoroutineDispatcher) - } - - override suspend fun afterContainer( - testCase: TestCase, - result: TestResult, - ) { - Dispatchers.resetMain() - testCoroutineDispatcher.cleanupTestCoroutines() - } -} diff --git a/settings.gradle.kts b/settings.gradle.kts index ec72b53..8595f08 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -6,7 +6,7 @@ pluginManagement { } } dependencyResolutionManagement { - repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) + repositoriesMode.set(RepositoriesMode.PREFER_SETTINGS) repositories { google() mavenCentral() From 5ca554631295980ebdb7ef2ea46550fe0868ecf0 Mon Sep 17 00:00:00 2001 From: extmkv Date: Tue, 10 Sep 2024 09:52:33 +0200 Subject: [PATCH 2/3] Bumped MVI to 1.8.0 --- docs/README.md | 2 +- gradle/libs.versions.toml | 2 +- mvi/build.gradle.kts | 9 ++++---- mvi/gradle.properties | 2 +- .../kotlin/com/adidas/mvi/Multimap.kt | 3 +-- .../adidas/mvi/reducer/ReducerExtensions.kt | 2 +- .../com/adidas/mvi/sideeffects/SideEffects.kt | 17 +++++++------- .../com/adidas/mvi/CoroutineListener.kt | 13 ++++++----- .../com/adidas/mvi/DispatchersContainer.kt | 0 .../adidas/mvi/FixedDispatchersContainer.kt | 0 .../kotlin/com/adidas/mvi/MultimapTests.kt | 2 +- .../product/FakeProductSideEffectTransform.kt | 0 .../mvi/product/FakeProductViewTransform.kt | 0 .../adidas/mvi/product/ProductSideEffect.kt | 0 .../com/adidas/mvi/product/ProductState.kt | 0 .../mvi/reducer/ReducerExtensionsTest.kt | 0 .../com/adidas/mvi/reducer/ReducerTests.kt | 4 +--- .../reducer/TestCancellationReducerWrapper.kt | 0 .../com/adidas/mvi/reducer/TestIntent.kt | 0 .../com/adidas/mvi/reducer/TestSideEffect.kt | 0 .../com/adidas/mvi/reducer/TestState.kt | 0 .../com/adidas/mvi/reducer/TestTransform.kt | 0 .../mvi/reducer/logger/LoggerMatchers.kt | 0 .../adidas/mvi/reducer/logger/SpyLogger.kt | 0 .../requirements/ReduceRequirementTests.kt | 0 .../adidas/mvi/sideeffects/SideEffectsTest.kt | 22 ++++++++++--------- .../adidas/mvi/sideeffects/TestSideEffect.kt | 0 .../adidas/mvi/transform/OperatorsTests.kt | 0 .../com/adidas/mvi/transform/ReplaceTests.kt | 0 .../mvi/transform/SideEffectTransformTest.kt | 0 .../mvi/transform/StateTransformTest.kt | 0 31 files changed, 41 insertions(+), 37 deletions(-) rename mvi/src/{commonTest => jvmTest}/kotlin/com/adidas/mvi/CoroutineListener.kt (79%) rename mvi/src/{commonTest => jvmTest}/kotlin/com/adidas/mvi/DispatchersContainer.kt (100%) rename mvi/src/{commonTest => jvmTest}/kotlin/com/adidas/mvi/FixedDispatchersContainer.kt (100%) rename mvi/src/{commonTest => jvmTest}/kotlin/com/adidas/mvi/MultimapTests.kt (99%) rename mvi/src/{commonTest => jvmTest}/kotlin/com/adidas/mvi/product/FakeProductSideEffectTransform.kt (100%) rename mvi/src/{commonTest => jvmTest}/kotlin/com/adidas/mvi/product/FakeProductViewTransform.kt (100%) rename mvi/src/{commonTest => jvmTest}/kotlin/com/adidas/mvi/product/ProductSideEffect.kt (100%) rename mvi/src/{commonTest => jvmTest}/kotlin/com/adidas/mvi/product/ProductState.kt (100%) rename mvi/src/{commonTest => jvmTest}/kotlin/com/adidas/mvi/reducer/ReducerExtensionsTest.kt (100%) rename mvi/src/{commonTest => jvmTest}/kotlin/com/adidas/mvi/reducer/ReducerTests.kt (98%) rename mvi/src/{commonTest => jvmTest}/kotlin/com/adidas/mvi/reducer/TestCancellationReducerWrapper.kt (100%) rename mvi/src/{commonTest => jvmTest}/kotlin/com/adidas/mvi/reducer/TestIntent.kt (100%) rename mvi/src/{commonTest => jvmTest}/kotlin/com/adidas/mvi/reducer/TestSideEffect.kt (100%) rename mvi/src/{commonTest => jvmTest}/kotlin/com/adidas/mvi/reducer/TestState.kt (100%) rename mvi/src/{commonTest => jvmTest}/kotlin/com/adidas/mvi/reducer/TestTransform.kt (100%) rename mvi/src/{commonTest => jvmTest}/kotlin/com/adidas/mvi/reducer/logger/LoggerMatchers.kt (100%) rename mvi/src/{commonTest => jvmTest}/kotlin/com/adidas/mvi/reducer/logger/SpyLogger.kt (100%) rename mvi/src/{commonTest => jvmTest}/kotlin/com/adidas/mvi/requirements/ReduceRequirementTests.kt (100%) rename mvi/src/{commonTest => jvmTest}/kotlin/com/adidas/mvi/sideeffects/SideEffectsTest.kt (85%) rename mvi/src/{commonTest => jvmTest}/kotlin/com/adidas/mvi/sideeffects/TestSideEffect.kt (100%) rename mvi/src/{commonTest => jvmTest}/kotlin/com/adidas/mvi/transform/OperatorsTests.kt (100%) rename mvi/src/{commonTest => jvmTest}/kotlin/com/adidas/mvi/transform/ReplaceTests.kt (100%) rename mvi/src/{commonTest => jvmTest}/kotlin/com/adidas/mvi/transform/SideEffectTransformTest.kt (100%) rename mvi/src/{commonTest => jvmTest}/kotlin/com/adidas/mvi/transform/StateTransformTest.kt (100%) diff --git a/docs/README.md b/docs/README.md index 30c00a9..4fd6428 100644 --- a/docs/README.md +++ b/docs/README.md @@ -2,7 +2,7 @@ adidas mvi Logo -[![Kotlin](https://img.shields.io/badge/Kotlin-1.9.22-blue.svg?style=flat&logo=kotlin)](https://kotlinlang.org) +[![Kotlin](https://img.shields.io/badge/Kotlin-2.0.0-blue.svg?style=flat&logo=kotlin)](https://kotlinlang.org) ![Test workflow](https://github.com/adidas/mvi/actions/workflows/deploy_docs.yml/badge.svg) [![adidas official](https://img.shields.io/badge/adidas-official-000000)](https://github.com/adidas) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 463bfcc..3f0caa8 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -15,7 +15,7 @@ activity = "1.9.2" lifecycle = "2.8.5" ktlint-gradle = "12.1.0" android-library = "8.3.2" -maven-publish = "0.25.2" +maven-publish = "0.29.0" ui = "1.7.0" mockk = "1.13.11" mvi-kotest = "0.0.2" diff --git a/mvi/build.gradle.kts b/mvi/build.gradle.kts index 974ff3d..a99af87 100644 --- a/mvi/build.gradle.kts +++ b/mvi/build.gradle.kts @@ -14,16 +14,20 @@ kotlin { jvm { withJava() } + iosX64() iosArm64() iosSimulatorArm64() + macosX64() macosArm64() + watchosArm32() watchosArm64() watchosDeviceArm64() watchosSimulatorArm64() watchosX64() + tvosArm64() tvosSimulatorArm64() tvosX64() @@ -33,13 +37,10 @@ kotlin { implementation(libs.coroutinesCore) } - commonTest.dependencies { + jvmTest.dependencies { implementation(libs.kotest.framework.engine) implementation(libs.kotest.assertions) implementation(libs.coroutinesTest) - } - - jvmTest.dependencies { implementation(libs.kotestRunner) } } diff --git a/mvi/gradle.properties b/mvi/gradle.properties index 23724e8..1e0eb73 100644 --- a/mvi/gradle.properties +++ b/mvi/gradle.properties @@ -1,6 +1,6 @@ POM_ARTIFACT_ID=mvi GROUP=com.adidas.mvi VERSION_CODE=1 -VERSION_NAME=1.7.0 +VERSION_NAME=1.8.0 POM_NAME=Adidas MVI POM_DESCRIPTION=Adidas MVI \ No newline at end of file diff --git a/mvi/src/commonMain/kotlin/com/adidas/mvi/Multimap.kt b/mvi/src/commonMain/kotlin/com/adidas/mvi/Multimap.kt index 31aed49..d4985fe 100644 --- a/mvi/src/commonMain/kotlin/com/adidas/mvi/Multimap.kt +++ b/mvi/src/commonMain/kotlin/com/adidas/mvi/Multimap.kt @@ -28,8 +28,7 @@ internal class Multimap { innerMap[key] = MutableList(values.size) { values[it] } } - operator fun get(key: TKey): List> = - innerMap[key]?.toList() ?: listOf() + operator fun get(key: TKey): List> = innerMap[key]?.toList() ?: listOf() operator fun get(keyClass: KClass): List> = keys diff --git a/mvi/src/commonMain/kotlin/com/adidas/mvi/reducer/ReducerExtensions.kt b/mvi/src/commonMain/kotlin/com/adidas/mvi/reducer/ReducerExtensions.kt index 9f3c89a..16beed5 100644 --- a/mvi/src/commonMain/kotlin/com/adidas/mvi/reducer/ReducerExtensions.kt +++ b/mvi/src/commonMain/kotlin/com/adidas/mvi/reducer/ReducerExtensions.kt @@ -31,6 +31,6 @@ public fun Reducer( public inline fun Reducer<*, *>.requireView(): TView = (state.value as State).view.apply { if (!TView::class.isInstance(this)) { - throw ClassCastException("Required view of ${TView::class} type, but found ${this}") + throw ClassCastException("Required view of ${TView::class} type, but found $this") } } diff --git a/mvi/src/commonMain/kotlin/com/adidas/mvi/sideeffects/SideEffects.kt b/mvi/src/commonMain/kotlin/com/adidas/mvi/sideeffects/SideEffects.kt index 1c6b2c5..8d83727 100644 --- a/mvi/src/commonMain/kotlin/com/adidas/mvi/sideeffects/SideEffects.kt +++ b/mvi/src/commonMain/kotlin/com/adidas/mvi/sideeffects/SideEffects.kt @@ -27,12 +27,13 @@ public class SideEffects() : Iterable { return SideEffects() } - override fun iterator(): Iterator = iterator { - while (true) { - val currentList = sideEffects.value - if (currentList.isEmpty()) break - val nextSideEffect = currentList.removeFirstOrNull() - nextSideEffect?.let { yield(it) } + override fun iterator(): Iterator = + iterator { + while (true) { + val currentList = sideEffects.value + if (currentList.isEmpty()) break + val nextSideEffect = currentList.removeFirstOrNull() + nextSideEffect?.let { yield(it) } + } } - } -} \ No newline at end of file +} diff --git a/mvi/src/commonTest/kotlin/com/adidas/mvi/CoroutineListener.kt b/mvi/src/jvmTest/kotlin/com/adidas/mvi/CoroutineListener.kt similarity index 79% rename from mvi/src/commonTest/kotlin/com/adidas/mvi/CoroutineListener.kt rename to mvi/src/jvmTest/kotlin/com/adidas/mvi/CoroutineListener.kt index e7f947b..ae7437b 100644 --- a/mvi/src/commonTest/kotlin/com/adidas/mvi/CoroutineListener.kt +++ b/mvi/src/jvmTest/kotlin/com/adidas/mvi/CoroutineListener.kt @@ -12,11 +12,11 @@ import kotlinx.coroutines.test.resetMain import kotlinx.coroutines.test.setMain internal class CoroutineListener( - internal val testCoroutineDispatcher: TestDispatcher = UnconfinedTestDispatcher( - TestCoroutineScheduler() - ), + internal val testCoroutineDispatcher: TestDispatcher = + UnconfinedTestDispatcher( + TestCoroutineScheduler(), + ), ) : TestListener { - internal val dispatchersContainer: DispatchersContainer = FixedDispatchersContainer(testCoroutineDispatcher) @@ -24,7 +24,10 @@ internal class CoroutineListener( Dispatchers.setMain(testCoroutineDispatcher) } - override suspend fun afterContainer(testCase: TestCase, result: TestResult) { + override suspend fun afterContainer( + testCase: TestCase, + result: TestResult, + ) { Dispatchers.resetMain() testCoroutineDispatcher.scheduler.cancel() } diff --git a/mvi/src/commonTest/kotlin/com/adidas/mvi/DispatchersContainer.kt b/mvi/src/jvmTest/kotlin/com/adidas/mvi/DispatchersContainer.kt similarity index 100% rename from mvi/src/commonTest/kotlin/com/adidas/mvi/DispatchersContainer.kt rename to mvi/src/jvmTest/kotlin/com/adidas/mvi/DispatchersContainer.kt diff --git a/mvi/src/commonTest/kotlin/com/adidas/mvi/FixedDispatchersContainer.kt b/mvi/src/jvmTest/kotlin/com/adidas/mvi/FixedDispatchersContainer.kt similarity index 100% rename from mvi/src/commonTest/kotlin/com/adidas/mvi/FixedDispatchersContainer.kt rename to mvi/src/jvmTest/kotlin/com/adidas/mvi/FixedDispatchersContainer.kt diff --git a/mvi/src/commonTest/kotlin/com/adidas/mvi/MultimapTests.kt b/mvi/src/jvmTest/kotlin/com/adidas/mvi/MultimapTests.kt similarity index 99% rename from mvi/src/commonTest/kotlin/com/adidas/mvi/MultimapTests.kt rename to mvi/src/jvmTest/kotlin/com/adidas/mvi/MultimapTests.kt index fbb3a2f..dbd0b55 100644 --- a/mvi/src/commonTest/kotlin/com/adidas/mvi/MultimapTests.kt +++ b/mvi/src/jvmTest/kotlin/com/adidas/mvi/MultimapTests.kt @@ -117,4 +117,4 @@ internal class MultimapTests : BehaviorSpec({ } } } -}) \ No newline at end of file +}) diff --git a/mvi/src/commonTest/kotlin/com/adidas/mvi/product/FakeProductSideEffectTransform.kt b/mvi/src/jvmTest/kotlin/com/adidas/mvi/product/FakeProductSideEffectTransform.kt similarity index 100% rename from mvi/src/commonTest/kotlin/com/adidas/mvi/product/FakeProductSideEffectTransform.kt rename to mvi/src/jvmTest/kotlin/com/adidas/mvi/product/FakeProductSideEffectTransform.kt diff --git a/mvi/src/commonTest/kotlin/com/adidas/mvi/product/FakeProductViewTransform.kt b/mvi/src/jvmTest/kotlin/com/adidas/mvi/product/FakeProductViewTransform.kt similarity index 100% rename from mvi/src/commonTest/kotlin/com/adidas/mvi/product/FakeProductViewTransform.kt rename to mvi/src/jvmTest/kotlin/com/adidas/mvi/product/FakeProductViewTransform.kt diff --git a/mvi/src/commonTest/kotlin/com/adidas/mvi/product/ProductSideEffect.kt b/mvi/src/jvmTest/kotlin/com/adidas/mvi/product/ProductSideEffect.kt similarity index 100% rename from mvi/src/commonTest/kotlin/com/adidas/mvi/product/ProductSideEffect.kt rename to mvi/src/jvmTest/kotlin/com/adidas/mvi/product/ProductSideEffect.kt diff --git a/mvi/src/commonTest/kotlin/com/adidas/mvi/product/ProductState.kt b/mvi/src/jvmTest/kotlin/com/adidas/mvi/product/ProductState.kt similarity index 100% rename from mvi/src/commonTest/kotlin/com/adidas/mvi/product/ProductState.kt rename to mvi/src/jvmTest/kotlin/com/adidas/mvi/product/ProductState.kt diff --git a/mvi/src/commonTest/kotlin/com/adidas/mvi/reducer/ReducerExtensionsTest.kt b/mvi/src/jvmTest/kotlin/com/adidas/mvi/reducer/ReducerExtensionsTest.kt similarity index 100% rename from mvi/src/commonTest/kotlin/com/adidas/mvi/reducer/ReducerExtensionsTest.kt rename to mvi/src/jvmTest/kotlin/com/adidas/mvi/reducer/ReducerExtensionsTest.kt diff --git a/mvi/src/commonTest/kotlin/com/adidas/mvi/reducer/ReducerTests.kt b/mvi/src/jvmTest/kotlin/com/adidas/mvi/reducer/ReducerTests.kt similarity index 98% rename from mvi/src/commonTest/kotlin/com/adidas/mvi/reducer/ReducerTests.kt rename to mvi/src/jvmTest/kotlin/com/adidas/mvi/reducer/ReducerTests.kt index 291e5b7..9096dbf 100644 --- a/mvi/src/commonTest/kotlin/com/adidas/mvi/reducer/ReducerTests.kt +++ b/mvi/src/jvmTest/kotlin/com/adidas/mvi/reducer/ReducerTests.kt @@ -197,9 +197,7 @@ private fun createIntentExecutorContainer( flowOf(TestTransform.Transform1) } -private fun createIntentExecutorContainer( - exception: Throwable, -): (TestIntent) -> Flow>> = +private fun createIntentExecutorContainer(exception: Throwable): (TestIntent) -> Flow>> = { if (it is TestIntent.SimpleIntent) throw exception emptyFlow() diff --git a/mvi/src/commonTest/kotlin/com/adidas/mvi/reducer/TestCancellationReducerWrapper.kt b/mvi/src/jvmTest/kotlin/com/adidas/mvi/reducer/TestCancellationReducerWrapper.kt similarity index 100% rename from mvi/src/commonTest/kotlin/com/adidas/mvi/reducer/TestCancellationReducerWrapper.kt rename to mvi/src/jvmTest/kotlin/com/adidas/mvi/reducer/TestCancellationReducerWrapper.kt diff --git a/mvi/src/commonTest/kotlin/com/adidas/mvi/reducer/TestIntent.kt b/mvi/src/jvmTest/kotlin/com/adidas/mvi/reducer/TestIntent.kt similarity index 100% rename from mvi/src/commonTest/kotlin/com/adidas/mvi/reducer/TestIntent.kt rename to mvi/src/jvmTest/kotlin/com/adidas/mvi/reducer/TestIntent.kt diff --git a/mvi/src/commonTest/kotlin/com/adidas/mvi/reducer/TestSideEffect.kt b/mvi/src/jvmTest/kotlin/com/adidas/mvi/reducer/TestSideEffect.kt similarity index 100% rename from mvi/src/commonTest/kotlin/com/adidas/mvi/reducer/TestSideEffect.kt rename to mvi/src/jvmTest/kotlin/com/adidas/mvi/reducer/TestSideEffect.kt diff --git a/mvi/src/commonTest/kotlin/com/adidas/mvi/reducer/TestState.kt b/mvi/src/jvmTest/kotlin/com/adidas/mvi/reducer/TestState.kt similarity index 100% rename from mvi/src/commonTest/kotlin/com/adidas/mvi/reducer/TestState.kt rename to mvi/src/jvmTest/kotlin/com/adidas/mvi/reducer/TestState.kt diff --git a/mvi/src/commonTest/kotlin/com/adidas/mvi/reducer/TestTransform.kt b/mvi/src/jvmTest/kotlin/com/adidas/mvi/reducer/TestTransform.kt similarity index 100% rename from mvi/src/commonTest/kotlin/com/adidas/mvi/reducer/TestTransform.kt rename to mvi/src/jvmTest/kotlin/com/adidas/mvi/reducer/TestTransform.kt diff --git a/mvi/src/commonTest/kotlin/com/adidas/mvi/reducer/logger/LoggerMatchers.kt b/mvi/src/jvmTest/kotlin/com/adidas/mvi/reducer/logger/LoggerMatchers.kt similarity index 100% rename from mvi/src/commonTest/kotlin/com/adidas/mvi/reducer/logger/LoggerMatchers.kt rename to mvi/src/jvmTest/kotlin/com/adidas/mvi/reducer/logger/LoggerMatchers.kt diff --git a/mvi/src/commonTest/kotlin/com/adidas/mvi/reducer/logger/SpyLogger.kt b/mvi/src/jvmTest/kotlin/com/adidas/mvi/reducer/logger/SpyLogger.kt similarity index 100% rename from mvi/src/commonTest/kotlin/com/adidas/mvi/reducer/logger/SpyLogger.kt rename to mvi/src/jvmTest/kotlin/com/adidas/mvi/reducer/logger/SpyLogger.kt diff --git a/mvi/src/commonTest/kotlin/com/adidas/mvi/requirements/ReduceRequirementTests.kt b/mvi/src/jvmTest/kotlin/com/adidas/mvi/requirements/ReduceRequirementTests.kt similarity index 100% rename from mvi/src/commonTest/kotlin/com/adidas/mvi/requirements/ReduceRequirementTests.kt rename to mvi/src/jvmTest/kotlin/com/adidas/mvi/requirements/ReduceRequirementTests.kt diff --git a/mvi/src/commonTest/kotlin/com/adidas/mvi/sideeffects/SideEffectsTest.kt b/mvi/src/jvmTest/kotlin/com/adidas/mvi/sideeffects/SideEffectsTest.kt similarity index 85% rename from mvi/src/commonTest/kotlin/com/adidas/mvi/sideeffects/SideEffectsTest.kt rename to mvi/src/jvmTest/kotlin/com/adidas/mvi/sideeffects/SideEffectsTest.kt index d6994a7..3a0ea38 100644 --- a/mvi/src/commonTest/kotlin/com/adidas/mvi/sideeffects/SideEffectsTest.kt +++ b/mvi/src/jvmTest/kotlin/com/adidas/mvi/sideeffects/SideEffectsTest.kt @@ -69,23 +69,25 @@ internal class SideEffectsTest : BehaviorSpec({ val semaphore = Semaphore(2) - val readJob = launch(Dispatchers.Default) { - returnedSideEffects.forEach { _ -> - semaphore.acquire() // Wait for the signal + val readJob = + launch(Dispatchers.Default) { + returnedSideEffects.forEach { _ -> + semaphore.acquire() // Wait for the signal + } } - } - val addJob = launch(Dispatchers.Default) { - returnedSideEffects = sideEffects.add(secondSideEffectToBeAddedLater) - } + val addJob = + launch(Dispatchers.Default) { + returnedSideEffects = sideEffects.add(secondSideEffectToBeAddedLater) + } semaphore.release() then("It should be released only by the semaphore").config( timeout = - 5.toDuration( - DurationUnit.SECONDS, - ), + 5.toDuration( + DurationUnit.SECONDS, + ), ) { readJob.join() addJob.join() diff --git a/mvi/src/commonTest/kotlin/com/adidas/mvi/sideeffects/TestSideEffect.kt b/mvi/src/jvmTest/kotlin/com/adidas/mvi/sideeffects/TestSideEffect.kt similarity index 100% rename from mvi/src/commonTest/kotlin/com/adidas/mvi/sideeffects/TestSideEffect.kt rename to mvi/src/jvmTest/kotlin/com/adidas/mvi/sideeffects/TestSideEffect.kt diff --git a/mvi/src/commonTest/kotlin/com/adidas/mvi/transform/OperatorsTests.kt b/mvi/src/jvmTest/kotlin/com/adidas/mvi/transform/OperatorsTests.kt similarity index 100% rename from mvi/src/commonTest/kotlin/com/adidas/mvi/transform/OperatorsTests.kt rename to mvi/src/jvmTest/kotlin/com/adidas/mvi/transform/OperatorsTests.kt diff --git a/mvi/src/commonTest/kotlin/com/adidas/mvi/transform/ReplaceTests.kt b/mvi/src/jvmTest/kotlin/com/adidas/mvi/transform/ReplaceTests.kt similarity index 100% rename from mvi/src/commonTest/kotlin/com/adidas/mvi/transform/ReplaceTests.kt rename to mvi/src/jvmTest/kotlin/com/adidas/mvi/transform/ReplaceTests.kt diff --git a/mvi/src/commonTest/kotlin/com/adidas/mvi/transform/SideEffectTransformTest.kt b/mvi/src/jvmTest/kotlin/com/adidas/mvi/transform/SideEffectTransformTest.kt similarity index 100% rename from mvi/src/commonTest/kotlin/com/adidas/mvi/transform/SideEffectTransformTest.kt rename to mvi/src/jvmTest/kotlin/com/adidas/mvi/transform/SideEffectTransformTest.kt diff --git a/mvi/src/commonTest/kotlin/com/adidas/mvi/transform/StateTransformTest.kt b/mvi/src/jvmTest/kotlin/com/adidas/mvi/transform/StateTransformTest.kt similarity index 100% rename from mvi/src/commonTest/kotlin/com/adidas/mvi/transform/StateTransformTest.kt rename to mvi/src/jvmTest/kotlin/com/adidas/mvi/transform/StateTransformTest.kt From 984e203406e51e63bf368465d281d110bdcf468e Mon Sep 17 00:00:00 2001 From: extmkv Date: Tue, 10 Sep 2024 12:09:34 +0200 Subject: [PATCH 3/3] Added missing configs to upload to maven --- gradle.properties | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 2162cea..4db9e12 100644 --- a/gradle.properties +++ b/gradle.properties @@ -10,4 +10,6 @@ POM_DEVELOPER_ID=adidas POM_DEVELOPER_NAME=adidas POM_DEVELOPER_URL=https://github.com/adidas/ android.useAndroidX=true -org.gradle.jvmargs=-Xmx4608m \ No newline at end of file +org.gradle.jvmargs=-Xmx4608m +SONATYPE_HOST=S01 +RELEASE_SIGNING_ENABLED=true \ No newline at end of file