From 599cd09bf5a0e771a27b56129acdf2216cbb6edf Mon Sep 17 00:00:00 2001 From: John Rodriguez Date: Mon, 29 Jan 2024 20:24:26 -0500 Subject: [PATCH] Switch to moshi reflection adapter to avoid exposing a generated adapter in public API (#1268) --- build-logic/build.gradle | 1 - build.gradle | 1 - gradle/libs.versions.toml | 2 +- paparazzi-gradle-plugin/build.gradle | 3 +-- .../java/app/cash/paparazzi/gradle/PrepareResourcesTask.kt | 5 ++--- .../java/app/cash/paparazzi/gradle/PaparazziPluginTest.kt | 4 +++- paparazzi/build.gradle | 4 +--- paparazzi/src/main/java/app/cash/paparazzi/Environment.kt | 5 ++--- paparazzi/src/main/java/app/cash/paparazzi/Snapshot.kt | 2 -- .../main/java/app/cash/paparazzi/internal/PaparazziJson.kt | 2 ++ 10 files changed, 12 insertions(+), 17 deletions(-) diff --git a/build-logic/build.gradle b/build-logic/build.gradle index 8b93612acd..7db1e7ef78 100644 --- a/build-logic/build.gradle +++ b/build-logic/build.gradle @@ -9,7 +9,6 @@ buildscript { classpath libs.plugin.kotlin classpath libs.plugin.android classpath libs.plugin.buildConfig - classpath libs.plugin.ksp classpath libs.grgit } } diff --git a/build.gradle b/build.gradle index da1ef269bf..fd19536fb8 100644 --- a/build.gradle +++ b/build.gradle @@ -16,7 +16,6 @@ buildscript { classpath libs.plugin.versions classpath libs.plugin.spotless classpath libs.plugin.buildConfig - classpath libs.plugin.ksp classpath libs.grgit // Normally you would declare a version here, but we use dependency substitution in diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index c0345e23b9..6ec746b5a3 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -53,7 +53,7 @@ layoutlib-native-windows = { module = "app.cash.paparazzi:layoutlib-native-win", moshi-adapters = { module = "com.squareup.moshi:moshi-adapters", version.ref = "moshi" } moshi-core = { module = "com.squareup.moshi:moshi", version.ref = "moshi" } -moshi-kotlinCodegen = { module = "com.squareup.moshi:moshi-kotlin-codegen", version.ref = "moshi" } +moshi-kotlinReflect = { module = "com.squareup.moshi:moshi-kotlin", version.ref = "moshi" } okio = { module = "com.squareup.okio:okio", version = "3.7.0" } diff --git a/paparazzi-gradle-plugin/build.gradle b/paparazzi-gradle-plugin/build.gradle index 4bf6513367..bb90c8b4b0 100644 --- a/paparazzi-gradle-plugin/build.gradle +++ b/paparazzi-gradle-plugin/build.gradle @@ -1,7 +1,6 @@ apply plugin: 'org.jetbrains.kotlin.jvm' apply plugin: 'java-gradle-plugin' apply plugin: 'com.github.gmazzo.buildconfig' -apply plugin: 'com.google.devtools.ksp' // This module is included in two projects: // - In the root project where it's released as one of our artifacts @@ -31,7 +30,7 @@ dependencies { } implementation libs.moshi.core implementation libs.moshi.adapters - ksp libs.moshi.kotlinCodegen + implementation libs.moshi.kotlinReflect testImplementation libs.junit testImplementation libs.truth diff --git a/paparazzi-gradle-plugin/src/main/java/app/cash/paparazzi/gradle/PrepareResourcesTask.kt b/paparazzi-gradle-plugin/src/main/java/app/cash/paparazzi/gradle/PrepareResourcesTask.kt index 65dda4e4ce..2dc300ccf7 100644 --- a/paparazzi-gradle-plugin/src/main/java/app/cash/paparazzi/gradle/PrepareResourcesTask.kt +++ b/paparazzi-gradle-plugin/src/main/java/app/cash/paparazzi/gradle/PrepareResourcesTask.kt @@ -16,8 +16,8 @@ package app.cash.paparazzi.gradle import app.cash.paparazzi.gradle.utils.relativize -import com.squareup.moshi.JsonClass import com.squareup.moshi.Moshi +import com.squareup.moshi.kotlin.reflect.KotlinJsonAdapterFactory import org.gradle.api.DefaultTask import org.gradle.api.file.ConfigurableFileCollection import org.gradle.api.file.RegularFileProperty @@ -102,12 +102,11 @@ abstract class PrepareResourcesTask : DefaultTask() { projectAssetDirs = projectAssetDirs.get(), aarAssetDirs = aarAssetDirs.relativize(gradleUserHomeDirectory) ) - val moshi = Moshi.Builder().build()!! + val moshi = Moshi.Builder().addLast(KotlinJsonAdapterFactory()).build()!! val json = moshi.adapter(Config::class.java).indent(" ").toJson(config) out.writeText(json) } - @JsonClass(generateAdapter = true) data class Config( val mainPackage: String, val targetSdkVersion: String, diff --git a/paparazzi-gradle-plugin/src/test/java/app/cash/paparazzi/gradle/PaparazziPluginTest.kt b/paparazzi-gradle-plugin/src/test/java/app/cash/paparazzi/gradle/PaparazziPluginTest.kt index b832754705..af6279d0ef 100644 --- a/paparazzi-gradle-plugin/src/test/java/app/cash/paparazzi/gradle/PaparazziPluginTest.kt +++ b/paparazzi-gradle-plugin/src/test/java/app/cash/paparazzi/gradle/PaparazziPluginTest.kt @@ -5,6 +5,7 @@ import app.cash.paparazzi.gradle.PrepareResourcesTask.Config import com.google.common.truth.Correspondence import com.google.common.truth.Truth.assertThat import com.squareup.moshi.Moshi +import com.squareup.moshi.kotlin.reflect.KotlinJsonAdapterFactory import okio.buffer import okio.source import org.gradle.testkit.runner.BuildResult @@ -1742,7 +1743,8 @@ class PaparazziPluginTest { private fun File.registerForDeletionOnExit() = apply { filesToDelete += this } companion object { - private val CONFIG_ADAPTER = Moshi.Builder().build()!!.adapter(Config::class.java) + private val CONFIG_ADAPTER = + Moshi.Builder().addLast(KotlinJsonAdapterFactory()).build()!!.adapter(Config::class.java) private val MATCHES_PATTERN = Correspondence.from( { actual, expected -> actual.matches(expected.toRegex()) }, "matches" ) diff --git a/paparazzi/build.gradle b/paparazzi/build.gradle index b9644c0ab8..a5a33451e2 100644 --- a/paparazzi/build.gradle +++ b/paparazzi/build.gradle @@ -3,7 +3,6 @@ import org.jetbrains.kotlin.gradle.plugin.AbstractKotlinPluginKt apply plugin: 'org.jetbrains.kotlin.jvm' apply plugin: 'org.jetbrains.dokka' apply plugin: 'com.vanniktech.maven.publish' -apply plugin: 'com.google.devtools.ksp' java { sourceCompatibility = libs.versions.javaTarget.get() @@ -55,11 +54,10 @@ dependencies { api platform(libs.kotlin.bom) implementation libs.moshi.core implementation libs.moshi.adapters + implementation libs.moshi.kotlinReflect implementation libs.jcodec.core implementation libs.jcodec.javase - ksp libs.moshi.kotlinCodegen - def osName = System.getProperty("os.name").toLowerCase(Locale.US) if (osName.startsWith("mac")) { def osArch = System.getProperty("os.arch").toLowerCase(Locale.US) diff --git a/paparazzi/src/main/java/app/cash/paparazzi/Environment.kt b/paparazzi/src/main/java/app/cash/paparazzi/Environment.kt index 0d8eb98379..3538501530 100644 --- a/paparazzi/src/main/java/app/cash/paparazzi/Environment.kt +++ b/paparazzi/src/main/java/app/cash/paparazzi/Environment.kt @@ -15,8 +15,8 @@ */ package app.cash.paparazzi -import com.squareup.moshi.JsonClass import com.squareup.moshi.Moshi +import com.squareup.moshi.kotlin.reflect.KotlinJsonAdapterFactory import okio.buffer import okio.source import java.io.File @@ -63,7 +63,7 @@ fun detectEnvironment(): Environment { val androidHome = Paths.get(androidHome()) val resourcesFile = File(System.getProperty("paparazzi.test.resources")) - val moshi = Moshi.Builder().build()!! + val moshi = Moshi.Builder().addLast(KotlinJsonAdapterFactory()).build()!! val config = resourcesFile.source().buffer().use { moshi.adapter(Config::class.java).fromJson(it)!! } @@ -81,7 +81,6 @@ fun detectEnvironment(): Environment { ) } -@JsonClass(generateAdapter = true) data class Config( val mainPackage: String, val targetSdkVersion: String, diff --git a/paparazzi/src/main/java/app/cash/paparazzi/Snapshot.kt b/paparazzi/src/main/java/app/cash/paparazzi/Snapshot.kt index f6da41bc61..68027eb972 100644 --- a/paparazzi/src/main/java/app/cash/paparazzi/Snapshot.kt +++ b/paparazzi/src/main/java/app/cash/paparazzi/Snapshot.kt @@ -15,11 +15,9 @@ */ package app.cash.paparazzi -import com.squareup.moshi.JsonClass import java.util.Date import java.util.Locale -@JsonClass(generateAdapter = true) data class Snapshot( val name: String?, val testName: TestName, diff --git a/paparazzi/src/main/java/app/cash/paparazzi/internal/PaparazziJson.kt b/paparazzi/src/main/java/app/cash/paparazzi/internal/PaparazziJson.kt index 6739e81ee5..79a88e7944 100644 --- a/paparazzi/src/main/java/app/cash/paparazzi/internal/PaparazziJson.kt +++ b/paparazzi/src/main/java/app/cash/paparazzi/internal/PaparazziJson.kt @@ -23,12 +23,14 @@ import com.squareup.moshi.Moshi import com.squareup.moshi.ToJson import com.squareup.moshi.Types import com.squareup.moshi.adapters.Rfc3339DateJsonAdapter +import com.squareup.moshi.kotlin.reflect.KotlinJsonAdapterFactory import java.util.Date internal object PaparazziJson { val moshi = Moshi.Builder() .add(Date::class.java, Rfc3339DateJsonAdapter()) .add(this) + .addLast(KotlinJsonAdapterFactory()) .build()!! val listOfShotsAdapter: JsonAdapter> =