Skip to content

Commit 740f5f4

Browse files
runningcodeclaude
andcommitted
feat(snapshot): Merge snapshot extension into main sentry DSL
Move snapshot configuration from the standalone `sentrySnapshot` plugin into the main `sentry { snapshots { } }` extension. This consolidates the DSL surface and auto-detects Paparazzi for test generation. - Add `SnapshotsExtension` nested under `SentryPluginExtension` - Move Paparazzi detection and test generation wiring into `SentryPlugin` - Wire `sentryUploadSnapshots` task to Paparazzi output directory - Rename generate task to `sentryGenerateSnapshotsTests` for consistency - Remove standalone `SentrySnapshotPlugin` and `SentrySnapshotExtension` - Use plural "snapshots" naming consistently Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent da847d2 commit 740f5f4

7 files changed

Lines changed: 71 additions & 90 deletions

File tree

plugin-build/build.gradle.kts

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -164,10 +164,6 @@ gradlePlugin {
164164
id = "io.sentry.jvm.gradle"
165165
implementationClass = "io.sentry.jvm.gradle.SentryJvmPlugin"
166166
}
167-
register("sentrySnapshotPlugin") {
168-
id = "io.sentry.android.snapshot"
169-
implementationClass = "io.sentry.android.gradle.snapshot.SentrySnapshotPlugin"
170-
}
171167
register("sentrySnapshotMetadataPlugin") {
172168
id = "io.sentry.android.snapshot.metadata"
173169
implementationClass =

plugin-build/src/main/kotlin/io/sentry/android/gradle/AndroidComponentsConfig.kt

Lines changed: 24 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -464,18 +464,31 @@ private fun ApplicationVariant.configureSnapshotsTasks(
464464
): TaskProvider<SentryUploadSnapshotsTask> {
465465
val variant = AndroidVariant74(this)
466466
val sentryProps = getPropertiesFilePath(project, variant)
467+
val taskSuffix = name.capitalized
467468

468-
return SentryUploadSnapshotsTask.register(
469-
project = project,
470-
extension = extension,
471-
sentryTelemetryProvider = null,
472-
cliExecutable = cliExecutable,
473-
sentryOrgOverride = sentryOrg,
474-
sentryProjectOverride = sentryProject,
475-
applicationId = applicationId,
476-
sentryProperties = sentryProps,
477-
taskSuffix = name.capitalized,
478-
)
469+
val uploadTask =
470+
SentryUploadSnapshotsTask.register(
471+
project = project,
472+
extension = extension,
473+
sentryTelemetryProvider = null,
474+
cliExecutable = cliExecutable,
475+
sentryOrgOverride = sentryOrg,
476+
sentryProjectOverride = sentryProject,
477+
applicationId = applicationId,
478+
sentryProperties = sentryProps,
479+
taskSuffix = taskSuffix,
480+
)
481+
482+
project.pluginManager.withPlugin("app.cash.paparazzi") {
483+
uploadTask.configure { task ->
484+
task.snapshotsPath.convention(
485+
project.layout.buildDirectory.dir("reports/paparazzi/images")
486+
)
487+
task.mustRunAfter("recordPaparazzi$taskSuffix")
488+
}
489+
}
490+
491+
return uploadTask
479492
}
480493

481494
/**

plugin-build/src/main/kotlin/io/sentry/android/gradle/SentryPlugin.kt

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
11
package io.sentry.android.gradle
22

33
import com.android.build.api.variant.ApplicationAndroidComponentsExtension
4+
import com.android.build.api.variant.HostTestBuilder.Companion.UNIT_TEST_TYPE
5+
import com.android.build.gradle.BaseExtension
46
import io.sentry.BuildConfig
57
import io.sentry.android.gradle.autoinstall.installDependencies
68
import io.sentry.android.gradle.extensions.SentryPluginExtension
9+
import io.sentry.android.gradle.snapshot.GenerateSnapshotTestsTask
710
import io.sentry.android.gradle.util.AgpVersions
811
import java.io.File
912
import javax.inject.Inject
@@ -66,6 +69,36 @@ constructor(private val buildEvents: BuildEventListenerRegistryInternal) : Plugi
6669
)
6770

6871
project.installDependencies(extension, true)
72+
73+
project.pluginManager.withPlugin("app.cash.paparazzi") {
74+
val android = project.extensions.getByType(BaseExtension::class.java)
75+
76+
project.dependencies.add(
77+
"testImplementation",
78+
"io.github.sergio-sastre.ComposablePreviewScanner:android:0.8.1",
79+
)
80+
81+
androidComponentsExt.onVariants { variant ->
82+
val generateTask =
83+
GenerateSnapshotTestsTask.register(project, extension.snapshots, android, variant)
84+
if (AgpVersions.isAGP90(AgpVersions.CURRENT)) {
85+
variant.hostTests[UNIT_TEST_TYPE]?.apply {
86+
sources.java?.addGeneratedSourceDirectory(
87+
generateTask,
88+
GenerateSnapshotTestsTask::outputDir,
89+
)
90+
}
91+
} else {
92+
@Suppress("DEPRECATION_ERROR")
93+
variant.unitTest?.apply {
94+
sources.java?.addGeneratedSourceDirectory(
95+
generateTask,
96+
GenerateSnapshotTestsTask::outputDir,
97+
)
98+
}
99+
}
100+
}
101+
}
69102
}
70103
}
71104

plugin-build/src/main/kotlin/io/sentry/android/gradle/extensions/SentryPluginExtension.kt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,13 @@ abstract class SentryPluginExtension @Inject constructor(project: Project) {
127127
vcsInfoAction.execute(vcsInfo)
128128
}
129129

130+
val snapshots: SnapshotsExtension = objects.newInstance(SnapshotsExtension::class.java)
131+
132+
@Experimental
133+
fun snapshots(snapshotsAction: Action<SnapshotsExtension>) {
134+
snapshotsAction.execute(snapshots)
135+
}
136+
130137
/**
131138
* Disables or enables the reporting of dependencies metadata for Sentry. If enabled the plugin
132139
* will collect external dependencies and will take care of uploading them to Sentry as part of

plugin-build/src/main/kotlin/io/sentry/android/gradle/snapshot/SentrySnapshotExtension.kt renamed to plugin-build/src/main/kotlin/io/sentry/android/gradle/extensions/SnapshotsExtension.kt

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,13 @@
1-
package io.sentry.android.gradle.snapshot
1+
package io.sentry.android.gradle.extensions
22

3+
import javax.inject.Inject
34
import org.gradle.api.model.ObjectFactory
45
import org.gradle.api.provider.ListProperty
56
import org.gradle.api.provider.Property
67
import org.jetbrains.annotations.ApiStatus
78

8-
/**
9-
* Experimental extension for configuring Compose @Preview snapshot testing. This API is subject to
10-
* change and will eventually be merged into the main `sentry` extension.
11-
*/
129
@ApiStatus.Experimental
13-
abstract class SentrySnapshotExtension(objects: ObjectFactory) {
10+
open class SnapshotsExtension @Inject constructor(objects: ObjectFactory) {
1411

1512
val includePrivatePreviews: Property<Boolean> =
1613
objects.property(Boolean::class.java).convention(false)

plugin-build/src/main/kotlin/io/sentry/android/gradle/snapshot/GenerateSnapshotTestsTask.kt

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package io.sentry.android.gradle.snapshot
33
import com.android.build.api.variant.ApplicationVariant
44
import com.android.build.gradle.BaseExtension
55
import io.sentry.android.gradle.SentryTasksProvider.capitalized
6+
import io.sentry.android.gradle.extensions.SnapshotsExtension
67
import java.io.File
78
import org.gradle.api.DefaultTask
89
import org.gradle.api.Project
@@ -58,12 +59,12 @@ abstract class GenerateSnapshotTestsTask : DefaultTask() {
5859

5960
fun register(
6061
project: Project,
61-
extension: SentrySnapshotExtension,
62+
extension: SnapshotsExtension,
6263
android: BaseExtension,
6364
variant: ApplicationVariant,
6465
): TaskProvider<GenerateSnapshotTestsTask> {
6566
return project.tasks.register(
66-
"generateSentrySnapshotTests${variant.name.capitalized}",
67+
"sentryGenerateSnapshotsTests${variant.name.capitalized}",
6768
GenerateSnapshotTestsTask::class.java,
6869
) { task ->
6970
task.includePrivatePreviews.set(extension.includePrivatePreviews)
@@ -75,7 +76,7 @@ abstract class GenerateSnapshotTestsTask : DefaultTask() {
7576
}
7677
)
7778
task.outputDir.set(
78-
project.layout.buildDirectory.dir("generated/sentry/snapshotTests/${variant.name}")
79+
project.layout.buildDirectory.dir("generated/sentry/snapshotsTests/${variant.name}")
7980
)
8081
}
8182
}

plugin-build/src/main/kotlin/io/sentry/android/gradle/snapshot/SentrySnapshotPlugin.kt

Lines changed: 0 additions & 66 deletions
This file was deleted.

0 commit comments

Comments
 (0)