Skip to content

Commit

Permalink
Cleanup from upstream changes
Browse files Browse the repository at this point in the history
  • Loading branch information
geoff-powell committed Aug 26, 2024
1 parent 2394339 commit 232ddb5
Show file tree
Hide file tree
Showing 21 changed files with 297 additions and 135 deletions.
13 changes: 5 additions & 8 deletions paparazzi-annotations/api/paparazzi-annotations.api
Original file line number Diff line number Diff line change
Expand Up @@ -5,29 +5,26 @@ public abstract interface class app/cash/paparazzi/annotations/PaparazziPreviewD
}

public final class app/cash/paparazzi/annotations/PaparazziPreviewData$Default : app/cash/paparazzi/annotations/PaparazziPreviewData {
public static final field $stable I
public fun <init> (Ljava/lang/String;Lkotlin/jvm/functions/Function2;)V
public fun <init> (Ljava/lang/String;Lkotlin/jvm/functions/Function0;)V
public final fun component1 ()Ljava/lang/String;
public final fun component2 ()Lkotlin/jvm/functions/Function2;
public final fun copy (Ljava/lang/String;Lkotlin/jvm/functions/Function2;)Lapp/cash/paparazzi/annotations/PaparazziPreviewData$Default;
public static synthetic fun copy$default (Lapp/cash/paparazzi/annotations/PaparazziPreviewData$Default;Ljava/lang/String;Lkotlin/jvm/functions/Function2;ILjava/lang/Object;)Lapp/cash/paparazzi/annotations/PaparazziPreviewData$Default;
public final fun component2 ()Lkotlin/jvm/functions/Function0;
public final fun copy (Ljava/lang/String;Lkotlin/jvm/functions/Function0;)Lapp/cash/paparazzi/annotations/PaparazziPreviewData$Default;
public static synthetic fun copy$default (Lapp/cash/paparazzi/annotations/PaparazziPreviewData$Default;Ljava/lang/String;Lkotlin/jvm/functions/Function0;ILjava/lang/Object;)Lapp/cash/paparazzi/annotations/PaparazziPreviewData$Default;
public fun equals (Ljava/lang/Object;)Z
public final fun getComposable ()Lkotlin/jvm/functions/Function2;
public final fun getComposable ()Lkotlin/jvm/functions/Function0;
public final fun getSnapshotName ()Ljava/lang/String;
public fun hashCode ()I
public fun toString ()Ljava/lang/String;
}

public final class app/cash/paparazzi/annotations/PaparazziPreviewData$Empty : app/cash/paparazzi/annotations/PaparazziPreviewData {
public static final field $stable I
public static final field INSTANCE Lapp/cash/paparazzi/annotations/PaparazziPreviewData$Empty;
public fun equals (Ljava/lang/Object;)Z
public fun hashCode ()I
public fun toString ()Ljava/lang/String;
}

public final class app/cash/paparazzi/annotations/PaparazziPreviewData$Error : app/cash/paparazzi/annotations/PaparazziPreviewData {
public static final field $stable I
public fun <init> (Ljava/lang/String;Ljava/lang/String;)V
public final fun component1 ()Ljava/lang/String;
public final fun component2 ()Ljava/lang/String;
Expand Down
10 changes: 2 additions & 8 deletions paparazzi-annotations/build.gradle
Original file line number Diff line number Diff line change
@@ -1,13 +1,7 @@
import org.jetbrains.kotlin.gradle.plugin.AbstractKotlinPluginKt

apply plugin: 'org.jetbrains.kotlin.jvm'
apply plugin: 'org.jetbrains.kotlin.plugin.compose'
apply plugin: 'com.vanniktech.maven.publish'
apply plugin: 'aar2jar'

aar2jar.configureForConfiguration("compileOnly")

dependencies {
compileOnlyAarAsJar libs.compose.runtime

add(AbstractKotlinPluginKt.PLUGIN_CLASSPATH_CONFIGURATION_NAME, libs.compose.compiler)
compileOnly libs.compose.runtime
}
1 change: 1 addition & 0 deletions paparazzi-gradle-plugin/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ dependencies {
implementation libs.moshi.core
implementation libs.moshi.adapters
implementation libs.moshi.kotlinReflect
implementation files(libs.class.superclass.protectionDomain.codeSource.location)

testImplementation libs.junit
testImplementation libs.truth
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,22 +15,15 @@
*/
package app.cash.paparazzi.gradle

import app.cash.paparazzi.gradle.utils.registerGeneratePreviewTask
import app.cash.paparazzi.gradle.utils.artifactViewFor
import app.cash.paparazzi.gradle.utils.registerGeneratePreviewTask
import app.cash.paparazzi.gradle.utils.relativize
import com.android.build.api.variant.AndroidComponentsExtension
import com.android.build.api.variant.ApplicationAndroidComponentsExtension
import com.android.build.api.variant.DynamicFeatureAndroidComponentsExtension
import com.android.build.api.variant.HasUnitTest
import com.android.build.api.variant.LibraryAndroidComponentsExtension
import com.android.build.gradle.BaseExtension
import com.android.build.gradle.LibraryExtension
import com.android.build.gradle.TestedExtension
import com.android.build.gradle.api.BaseVariant
import com.android.build.gradle.internal.api.TestedVariant
import com.android.build.gradle.internal.dsl.BaseAppModuleExtension
import com.android.build.gradle.internal.dsl.DynamicFeatureExtension
import com.android.build.gradle.internal.publishing.AndroidArtifacts.ArtifactType
import com.google.devtools.ksp.gradle.KspExtension
import com.google.devtools.ksp.gradle.KspGradleSubplugin
import org.gradle.api.DefaultTask
Expand All @@ -42,6 +35,7 @@ import org.gradle.api.file.Directory
import org.gradle.api.file.FileCollection
import org.gradle.api.internal.artifacts.transform.UnzipTransform
import org.gradle.api.logging.LogLevel.LIFECYCLE
import org.gradle.api.provider.Property
import org.gradle.api.provider.Provider
import org.gradle.api.provider.ProviderFactory
import org.gradle.api.reporting.ReportingExtension
Expand Down Expand Up @@ -93,7 +87,7 @@ public class PaparazziPlugin @Inject constructor(
else -> error("${androidComponents.javaClass.name} from $plugin is not supported in Paparazzi")
}
setupPaparazzi(project, androidComponents)
setupPreviewProcessor(project, variants)
setupPreviewProcessor(project)
}
}
}
Expand Down Expand Up @@ -249,10 +243,9 @@ public class PaparazziPlugin @Inject constructor(
}
}

private fun <T> setupPreviewProcessor(
private fun setupPreviewProcessor(
project: Project,
variants: DomainObjectSet<T>
) where T : BaseVariant, T : TestedVariant {
) {
project.pluginManager.apply(KspGradleSubplugin::class.java)

project.addAnnotationsDependency()
Expand All @@ -263,8 +256,8 @@ public class PaparazziPlugin @Inject constructor(
val kspExtension = project.extensions.getByType(KspExtension::class.java)
val android = project.extensions.getByType(BaseExtension::class.java)
kspExtension.arg(KSP_ARG_NAMESPACE, android.packageName())

project.registerGeneratePreviewTask(variants, config)
project.registerGeneratePreviewTask(config)
}
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package app.cash.paparazzi.gradle

private const val PREVIEW_TEST_SOURCE = """
import app.cash.paparazzi.Paparazzi
import app.cash.paparazzi.preview.DefaultLocaleRule
import app.cash.paparazzi.preview.PaparazziPreviewData
import app.cash.paparazzi.preview.PaparazziValuesProvider
import app.cash.paparazzi.preview.deviceConfig
import app.cash.paparazzi.preview.locale
import app.cash.paparazzi.preview.snapshot
import com.android.ide.common.rendering.api.SessionParams.RenderingMode.SHRINK
import com.google.testing.junit.testparameterinjector.TestParameter
import com.google.testing.junit.testparameterinjector.TestParameterInjector
import org.junit.Assume.assumeTrue
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
@RunWith(TestParameterInjector::class)
class PreviewTests(
@TestParameter(valuesProvider = PreviewConfigValuesProvider::class)
private val preview: PaparazziPreviewData,
) {
private class PreviewConfigValuesProvider : PaparazziValuesProvider(paparazziPreviews)
@get:Rule
val paparazzi = Paparazzi(
deviceConfig = preview.deviceConfig(),
renderingMode = SHRINK,
maxPercentDifference = 0.11,
)
@get:Rule
val localeRule = DefaultLocaleRule(preview.locale())
@Test
fun preview() {
assumeTrue(preview !is PaparazziPreviewData.Empty)
paparazzi.snapshot(preview)
}
}
"""
Original file line number Diff line number Diff line change
@@ -1,10 +1,9 @@
package app.cash.paparazzi.gradle.utils

import app.cash.paparazzi.gradle.PaparazziExtension
import com.android.build.api.variant.AndroidComponentsExtension
import com.android.build.gradle.LibraryExtension
import com.android.build.gradle.TestedExtension
import com.android.build.gradle.api.BaseVariant
import com.android.build.gradle.internal.api.TestedVariant
import org.gradle.api.DomainObjectSet
import org.gradle.api.Project
import java.io.File
import java.util.Locale
Expand All @@ -14,53 +13,63 @@ private const val KSP_SOURCE_DIR = "build/generated/ksp"
private const val PREVIEW_DATA_FILE = "paparazziPreviews.kt"
private const val PREVIEW_TEST_FILE = "PreviewTests.kt"

internal fun <T> Project.registerGeneratePreviewTask(
variants: DomainObjectSet<T>,
private val Project.libraryExtension: LibraryExtension?
get() = extensionByTypeOrNull(LibraryExtension::class.java)

private fun <T> Project.extensionByTypeOrNull(cls: Class<T>): T? =
try {
extensions.getByType(cls)
} catch (e: Exception) {
null
}

internal fun Project.registerGeneratePreviewTask(
config: PaparazziExtension
) where T : BaseVariant, T : TestedVariant {
val extension = extensions.getByType(TestedExtension::class.java)
val namespace = extension.namespace
val namespaceDir = namespace?.replace(".", "/")
) {
libraryExtension?.let { library ->
library.libraryVariants.all { variant ->
val namespace = library.namespace
val namespaceDir = namespace?.replace(".", "/")

variants.all { variant ->
val typeName = variant.buildType.name
val typeNameCap = typeName.capitalize()
val typeName = variant.buildType.name
val typeNameCap = typeName.capitalize()

val testSourceDir = "$projectDir/$TEST_SOURCE_DIR/${typeName}UnitTest"
val previewTestDir = "$testSourceDir/$namespaceDir"
val testSourceDir = "$projectDir/$TEST_SOURCE_DIR/${typeName}UnitTest"
val previewTestDir = "$testSourceDir/$namespaceDir"

extension.sourceSets.getByName("test$typeNameCap").java {
srcDir(testSourceDir)
}
library.sourceSets.getByName("test$typeNameCap").java {
srcDir(testSourceDir)
}
println("typeName: ${variant.buildType.name} ${library.namespace} $namespaceDir $typeNameCap")
if (config.generatePreviewTestClass.get()) {
val taskName = "paparazziGeneratePreview${typeNameCap}UnitTestKotlin"
tasks.register(taskName) { task ->
task.description = "Generates the preview test class to the test source set for $typeName"

if (config.generatePreviewTestClass.get()) {
val taskName = "paparazziGeneratePreview${typeNameCap}UnitTestKotlin"
tasks.register(taskName) { task ->
task.description = "Generates the preview test class to the test source set for $typeName"

task.dependsOn("ksp${typeNameCap}Kotlin")
task.inputs.file(
"$projectDir/$KSP_SOURCE_DIR/$typeName/kotlin/$namespaceDir/$PREVIEW_DATA_FILE"
)
task.outputs.dir(previewTestDir)
task.outputs.file("$previewTestDir/$PREVIEW_TEST_FILE")
task.outputs.cacheIf { true }

task.doLast {
File(previewTestDir).mkdirs()
File(previewTestDir, PREVIEW_TEST_FILE).writeText(
buildString {
appendLine("package $namespace")
append(PREVIEW_TEST_SOURCE)
}
task.dependsOn("ksp${typeNameCap}Kotlin")
task.inputs.file(
"$projectDir/$KSP_SOURCE_DIR/$typeName/kotlin/$namespaceDir/$PREVIEW_DATA_FILE"
)
task.outputs.dir(previewTestDir)
task.outputs.file("$previewTestDir/$PREVIEW_TEST_FILE")
task.outputs.cacheIf { true }

// test compilation depends on the task
tasks.findByName("compile${typeNameCap}UnitTestKotlin")?.dependsOn(taskName)
// run task before processing symbols
tasks.findByName("ksp${typeNameCap}UnitTestKotlin")?.mustRunAfter(taskName)

task.doLast {
File(previewTestDir).mkdirs()
File(previewTestDir, PREVIEW_TEST_FILE).writeText(
buildString {
appendLine("package $namespace")
append(PREVIEW_TEST_SOURCE)
}
)
}
}
}

// test compilation depends on the task
tasks.findByName("compile${typeNameCap}UnitTestKotlin")?.dependsOn(taskName)
// run task before processing symbols
tasks.findByName("ksp${typeNameCap}UnitTestKotlin")?.mustRunAfter(taskName)
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@ import org.gradle.testkit.runner.GradleRunner
import org.gradle.testkit.runner.TaskOutcome
import org.gradle.testkit.runner.TaskOutcome.FROM_CACHE
import org.gradle.testkit.runner.TaskOutcome.SUCCESS
import org.jetbrains.kotlin.gradle.report.TaskExecutionState
import org.junit.After
import org.junit.Before
import org.junit.Ignore
Expand Down Expand Up @@ -1396,35 +1395,39 @@ class PaparazziPluginTest {
val fixtureRoot = File("src/test/projects/preview-annotation-empty-test-suite")

val result = gradleRunner
.withArguments("testDebug", "--stacktrace")
.withArguments("verifyPaparazziDebug", "--stacktrace")
.runFixture(fixtureRoot) { build() }

val snapshotsDir = File(fixtureRoot, "build/reports/paparazzi/debug/images")
val snapshots = snapshotsDir.listFilesSorted()
assertThat(snapshots!!).hasSize(1)

val goldenImage = File(fixtureRoot, "src/test/resources/hello_paparazzi.png")
assertThat(snapshots.get(0)).isSimilarTo(goldenImage).withDefaultThreshold()
assertThat(snapshots[0]).isSimilarTo(goldenImage).withDefaultThreshold()

assertThat(result.task(":paparazziGeneratePreviewDebugUnitTestKotlin")).isNotNull()

val generatedPreviewsDir = File(fixtureRoot, "build/generated/ksp/debug/kotlin/app/cash/paparazzi/plugin/test/")
assertThat(generatedPreviewsDir.listFiles()?.any {
it.name == "paparazziPreviews.kt"
}).isTrue()
assertThat(
generatedPreviewsDir.listFiles()?.any {
it.name == "paparazziPreviews.kt"
}
).isTrue()

val generatedPreviewTestDir = File(fixtureRoot, "build/generated/source/paparazzi/debugUnitTest/app/cash/paparazzi/plugin/test/")
assertThat(generatedPreviewTestDir.listFiles()?.any {
it.name == "PreviewTests.kt"
}).isTrue()
assertThat(
generatedPreviewTestDir.listFiles()?.any {
it.name == "PreviewTests.kt"
}
).isTrue()
}

@Test
fun previewAnnotationErrorPrivatePreview() {
val fixtureRoot = File("src/test/projects/preview-annotation-private-preview")

val result = gradleRunner
.withArguments("testDebug", "--stacktrace")
.withArguments("verifyPaparazziDebug", "--stacktrace")
.forwardOutput()
.runFixture(fixtureRoot) { buildAndFail() }

Expand All @@ -1437,7 +1440,7 @@ class PaparazziPluginTest {
val fixtureRoot = File("src/test/projects/preview-annotation-preview-parameters")

val result = gradleRunner
.withArguments("testDebug", "--stacktrace")
.withArguments("verifyPaparazziDebug", "--stacktrace")
.forwardOutput()
.runFixture(fixtureRoot) { buildAndFail() }

Expand All @@ -1451,7 +1454,7 @@ class PaparazziPluginTest {

val result = gradleRunner
.forwardOutput()
.withArguments("testDebug", "--stacktrace")
.withArguments("verifyPaparazziDebug", "--stacktrace")
.runFixture(fixtureRoot) { build() }

assertThat(result.task(":paparazziGeneratePreviewDebugUnitTestKotlin")).isNull()
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
plugins {
id 'app.cash.paparazzi'
id 'com.android.library'
id 'kotlin-android'
id 'app.cash.paparazzi'
id 'org.jetbrains.kotlin.plugin.compose'
}

paparazzi {
Expand All @@ -24,14 +25,9 @@ android {
buildFeatures {
compose true
}
composeOptions {
kotlinCompilerExtensionVersion libs.versions.composeCompiler.get()
}
}

dependencies {
implementation libs.composeUi.material
implementation libs.composeUi.uiTooling
}

apply from: '../guava-fix.gradle'
Loading

0 comments on commit 232ddb5

Please sign in to comment.