Skip to content

Commit 2352bca

Browse files
authored
Use Moshi instead of KotlinX Serialization (#574)
* Use Moshi instead of KotlinX Serialization * Adjust snapshot for testing * Reset version number
1 parent a6dd41a commit 2352bca

File tree

7 files changed

+43
-26
lines changed

7 files changed

+43
-26
lines changed

gradle/libs.versions.toml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ junit = "1.2.1"
2323
benchmark-junit4 = "1.3.4"
2424
mockito = "5.17.0"
2525
mockito-kotlin = "5.4.0"
26+
moshi = "1.15.2"
2627
material3-android = "1.3.2"
2728
runtime-android = "1.7.6"
2829
foundation-layout-android = "1.7.6"
@@ -91,6 +92,10 @@ detekt-formatting = { module = "io.gitlab.arturbosch.detekt:detekt-formatting",
9192

9293
google-truth = "com.google.truth:truth:1.4.4"
9394

95+
moshi = { module = "com.squareup.moshi:moshi", version.ref = "moshi" }
96+
moshi-adapters = { module = "com.squareup.moshi:moshi-adapters", version.ref = "moshi" }
97+
moshi-kotlin = { module = "com.squareup.moshi:moshi-kotlin", version.ref = "moshi" }
98+
9499
junit4 = "junit:junit:4.13.2"
95100
junit5-bom = { module = "org.junit:junit-bom", version.ref = "junit-jupiter" }
96101
junit5-jupiter = { module = "org.junit.jupiter:junit-jupiter" }

snapshots/snapshots/build.gradle.kts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ plugins {
33
alias(libs.plugins.compose.compiler)
44
alias(libs.plugins.grgit)
55
alias(libs.plugins.kotlin.android)
6-
alias(libs.plugins.kotlin.serialization)
76
`maven-publish`
87
signing
98
}
@@ -49,7 +48,9 @@ android {
4948
dependencies {
5049

5150
implementation(libs.junit4)
52-
implementation(libs.kotlinx.serialization)
51+
implementation(libs.moshi)
52+
implementation(libs.moshi.kotlin)
53+
implementation(libs.moshi.adapters)
5354

5455
implementation(platform(libs.compose.bom))
5556
implementation(libs.compose.runtime)

snapshots/snapshots/src/main/kotlin/com/emergetools/snapshots/SnapshotImageMetadata.kt

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,18 @@
11
package com.emergetools.snapshots
22

33
import com.emergetools.snapshots.models.ComposePreviewSnapshotConfig
4-
import kotlinx.serialization.ExperimentalSerializationApi
5-
import kotlinx.serialization.Serializable
6-
import kotlinx.serialization.json.JsonClassDiscriminator
74

85
enum class SnapshotErrorType {
96
EMPTY_SNAPSHOT,
107
GENERAL,
118
}
129

13-
@OptIn(ExperimentalSerializationApi::class)
14-
@Serializable
15-
@JsonClassDiscriminator("metadataType")
1610
sealed class SnapshotMetadata {
1711
abstract val name: String
1812
abstract val displayName: String?
1913
abstract val fqn: String
2014
abstract val composePreviewSnapshotConfig: ComposePreviewSnapshotConfig
2115

22-
@Serializable
2316
internal class SuccessMetadata(
2417
// Used as the primary key
2518
override val name: String,
@@ -33,7 +26,6 @@ sealed class SnapshotMetadata {
3326
override val composePreviewSnapshotConfig: ComposePreviewSnapshotConfig,
3427
) : SnapshotMetadata()
3528

36-
@Serializable
3729
internal class ErrorMetadata(
3830
// Used as the primary key
3931
override val name: String,

snapshots/snapshots/src/main/kotlin/com/emergetools/snapshots/SnapshotSaver.kt

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,10 @@ import android.util.Log
77
import androidx.test.platform.app.InstrumentationRegistry
88
import com.emergetools.snapshots.models.ComposePreviewSnapshotConfig
99
import com.emergetools.snapshots.util.Profiler
10-
import kotlinx.serialization.json.Json
10+
import com.squareup.moshi.Moshi
11+
import com.squareup.moshi.adapter
12+
import com.squareup.moshi.adapters.PolymorphicJsonAdapterFactory
13+
import com.squareup.moshi.kotlin.reflect.KotlinJsonAdapterFactory
1114
import java.io.File
1215
import java.io.FileOutputStream
1316
import java.nio.charset.Charset
@@ -19,6 +22,23 @@ internal object SnapshotSaver {
1922
private const val ARG_KEY_SAVE_METADATA = "save_metadata"
2023
private const val TAG = "SnapshotSaver"
2124

25+
@OptIn(ExperimentalStdlibApi::class)
26+
private val moshiAdapter = Moshi.Builder()
27+
.add(
28+
PolymorphicJsonAdapterFactory.of(SnapshotMetadata::class.java, "metadataType")
29+
.withSubtype(
30+
SnapshotMetadata.SuccessMetadata::class.java,
31+
"com.emergetools.snapshots.SnapshotMetadata.SuccessMetadata"
32+
)
33+
.withSubtype(
34+
SnapshotMetadata.ErrorMetadata::class.java,
35+
"com.emergetools.snapshots.SnapshotMetadata.ErrorMetadata"
36+
)
37+
)
38+
.add(KotlinJsonAdapterFactory())
39+
.build()
40+
.adapter<SnapshotMetadata>()
41+
2242
private val targetContext: Context
2343
get() = InstrumentationRegistry.getInstrumentation().targetContext
2444

@@ -102,6 +122,7 @@ internal object SnapshotSaver {
102122
Profiler.endSpan()
103123
}
104124

125+
@OptIn(ExperimentalStdlibApi::class)
105126
private fun saveMetadata(
106127
snapshotsDir: File,
107128
keyName: String,
@@ -119,7 +140,7 @@ internal object SnapshotSaver {
119140
)
120141

121142
Log.d(TAG, "Saving metadata for $keyName")
122-
val jsonString = Json.encodeToString(metadata)
143+
val jsonString = moshiAdapter.toJson(metadata)
123144

124145
saveFile(snapshotsDir, "$keyName$JSON_EXTENSION") {
125146
write(jsonString.toByteArray(Charset.defaultCharset()))
@@ -145,7 +166,8 @@ internal object SnapshotSaver {
145166
)
146167

147168
Log.d(TAG, "Saving error metadata for $keyName")
148-
val jsonString = Json.encodeToString(metadata)
169+
170+
val jsonString = moshiAdapter.toJson(metadata)
149171

150172
saveFile(snapshotsDir, "$keyName$JSON_EXTENSION") {
151173
write(jsonString.toByteArray(Charset.defaultCharset()))

snapshots/snapshots/src/main/kotlin/com/emergetools/snapshots/compose/EmergeComposeSnapshotReflectiveParameterizedInvoker.kt

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,9 @@ import com.emergetools.snapshots.EmergeSnapshots
99
import com.emergetools.snapshots.models.ComposePreviewSnapshotConfig
1010
import com.emergetools.snapshots.models.ComposeSnapshots
1111
import com.emergetools.snapshots.util.Profiler
12-
import kotlinx.serialization.json.Json
12+
import com.squareup.moshi.Moshi
13+
import com.squareup.moshi.adapter
14+
import com.squareup.moshi.kotlin.reflect.KotlinJsonAdapterFactory
1315
import org.junit.Rule
1416
import org.junit.Test
1517
import org.junit.runner.RunWith
@@ -49,6 +51,7 @@ class EmergeComposeSnapshotReflectiveParameterizedInvoker(
4951
const val ELLIPSIS_SIZE = 3
5052
const val MAX_PARAM_NAME_LENGTH = 40
5153

54+
@OptIn(ExperimentalStdlibApi::class)
5255
@JvmStatic
5356
@Parameterized.Parameters(name = "{index}_{0}")
5457
fun data(): Iterable<EmergeComposeSnapshotReflectiveParameters> {
@@ -64,21 +67,22 @@ class EmergeComposeSnapshotReflectiveParameterizedInvoker(
6467
error("Unable to find file at $invokeDataPath")
6568
}
6669

67-
val json = Json {
68-
ignoreUnknownKeys = true
69-
}
70+
val moshi = Moshi.Builder()
71+
.add(KotlinJsonAdapterFactory())
72+
.build()
73+
val adapter = moshi.adapter<List<ComposePreviewSnapshotConfig>>()
7074

7175
val fileContent = invokeDataFile.readText()
7276
@Suppress("TooGenericExceptionCaught")
7377
return try {
7478
// First try to parse directly as List<ComposePreviewSnapshotConfig>
75-
json.decodeFromString<List<ComposePreviewSnapshotConfig>>(fileContent).map {
79+
adapter.fromJson(invokeDataFile.readText())!!.map {
7680
EmergeComposeSnapshotReflectiveParameters(it)
7781
}
7882
} catch (e: Exception) {
7983
// Fallback to parsing as ComposeSnapshots
8084
Log.d(TAG, "Failed to parse as List<ComposePreviewSnapshotConfig>, falling back to ComposeSnapshots", e)
81-
json.decodeFromString<ComposeSnapshots>(fileContent).snapshots.map {
85+
moshi.adapter<ComposeSnapshots>().fromJson(fileContent)!!.snapshots.map {
8286
EmergeComposeSnapshotReflectiveParameters(it)
8387
}
8488
}

snapshots/snapshots/src/main/kotlin/com/emergetools/snapshots/models/ComposePreviewSnapshotConfig.kt

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,7 @@
11
package com.emergetools.snapshots.models
22

3-
import kotlinx.serialization.Serializable
4-
53
// Keep parity with
64
// https://cs.android.com/androidx/platform/frameworks/support/+/androidx-main:compose/ui/ui-tooling-preview/src/androidMain/kotlin/androidx/compose/ui/tooling/preview/Preview.kt
7-
@Serializable
85
data class ComposePreviewSnapshotConfig(
96
val fullyQualifiedClassName: String,
107
val originalFqn: String,
@@ -75,7 +72,6 @@ data class ComposePreviewSnapshotConfig(
7572
}
7673
}
7774

78-
@Serializable
7975
data class PreviewParameter(
8076
val parameterName: String,
8177
val providerClassFqn: String,
Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,5 @@
11
package com.emergetools.snapshots.models
22

3-
import kotlinx.serialization.Serializable
4-
5-
@Serializable
63
data class ComposeSnapshots(
74
val snapshots: List<ComposePreviewSnapshotConfig>,
85
)

0 commit comments

Comments
 (0)