Skip to content

Commit 055f0a6

Browse files
runningcodeclaude
andauthored
refactor(snapshots): Group preview options under a previews sub-extension (#1167)
* refactor(snapshots): Group preview options under a previews sub-extension Reshape the experimental `sentry.snapshots { }` DSL so preview scanning and test generation options live under a nested `previews { }` block. `generateSnapshotTests` becomes `previews.generateTests`, and `includePrivatePreviews` and `theme` move under `previews`. Drop the top-level `packageTrees` DSL option and switch the generator to `.scanAllPackages()` so the generated test covers every package without requiring user configuration. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * style(snapshots): Apply spotless formatting to SnapshotPreviewsExtension Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * refactor(snapshots): Keep packageTrees under the previews sub-extension Restore the packageTrees DSL option under the new `previews { }` block. The generator emits `.scanPackageTrees(...)` again and falls back to the Android namespace when the list is empty. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
1 parent c41236c commit 055f0a6

5 files changed

Lines changed: 67 additions & 24 deletions

File tree

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -488,7 +488,7 @@ private fun ApplicationVariant.configureSnapshotsTasks(
488488

489489
// Wire Paparazzi test generation and upload task when the Paparazzi plugin is applied
490490
project.pluginManager.withPlugin("app.cash.paparazzi") {
491-
if (extension.snapshots.generateSnapshotTests.get()) {
491+
if (extension.snapshots.previews.generateTests.get()) {
492492
val android = project.extensions.getByType(BaseExtension::class.java)
493493

494494
project.dependencies.add(
@@ -508,7 +508,7 @@ private fun ApplicationVariant.configureSnapshotsTasks(
508508
val generateTask =
509509
GenerateSnapshotTestsTask.register(
510510
project,
511-
extension.snapshots,
511+
extension.snapshots.previews,
512512
android,
513513
this@configureSnapshotsTasks,
514514
paparazziMajorVersion,
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package io.sentry.android.gradle.extensions
2+
3+
import javax.inject.Inject
4+
import org.gradle.api.model.ObjectFactory
5+
import org.gradle.api.provider.ListProperty
6+
import org.gradle.api.provider.Property
7+
import org.jetbrains.annotations.ApiStatus
8+
9+
@ApiStatus.Experimental
10+
open class SnapshotPreviewsExtension @Inject constructor(objects: ObjectFactory) {
11+
12+
val generateTests: Property<Boolean> = objects.property(Boolean::class.java).convention(true)
13+
14+
val includePrivatePreviews: Property<Boolean> =
15+
objects.property(Boolean::class.java).convention(true)
16+
17+
val packageTrees: ListProperty<String> =
18+
objects.listProperty(String::class.java).convention(emptyList())
19+
20+
val theme: Property<String> = objects.property(String::class.java)
21+
}
Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
package io.sentry.android.gradle.extensions
22

33
import javax.inject.Inject
4+
import org.gradle.api.Action
45
import org.gradle.api.model.ObjectFactory
5-
import org.gradle.api.provider.ListProperty
66
import org.gradle.api.provider.Property
77
import org.jetbrains.annotations.ApiStatus
88

@@ -11,14 +11,10 @@ open class SnapshotsExtension @Inject constructor(objects: ObjectFactory) {
1111

1212
val enabled: Property<Boolean> = objects.property(Boolean::class.java).convention(false)
1313

14-
val generateSnapshotTests: Property<Boolean> =
15-
objects.property(Boolean::class.java).convention(true)
14+
val previews: SnapshotPreviewsExtension =
15+
objects.newInstance(SnapshotPreviewsExtension::class.java)
1616

17-
val includePrivatePreviews: Property<Boolean> =
18-
objects.property(Boolean::class.java).convention(true)
19-
20-
val packageTrees: ListProperty<String> =
21-
objects.listProperty(String::class.java).convention(emptyList())
22-
23-
val theme: Property<String> = objects.property(String::class.java)
17+
fun previews(action: Action<SnapshotPreviewsExtension>) {
18+
action.execute(previews)
19+
}
2420
}

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

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +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
6+
import io.sentry.android.gradle.extensions.SnapshotPreviewsExtension
77
import java.io.File
88
import org.gradle.api.DefaultTask
99
import org.gradle.api.Project
@@ -63,7 +63,7 @@ abstract class GenerateSnapshotTestsTask : DefaultTask() {
6363

6464
fun register(
6565
project: Project,
66-
extension: SnapshotsExtension,
66+
extension: SnapshotPreviewsExtension,
6767
android: BaseExtension,
6868
variant: ApplicationVariant,
6969
paparazziMajorVersion: Provider<Int>,
@@ -76,7 +76,6 @@ abstract class GenerateSnapshotTestsTask : DefaultTask() {
7676
task.theme.set(extension.theme)
7777
task.paparazziMajorVersion.value(paparazziMajorVersion)
7878
// Fall back to the Android namespace when the user doesn't configure packageTrees
79-
// TODO do we actually need this?
8079
task.packageTrees.set(
8180
extension.packageTrees.map { packages ->
8281
packages.ifEmpty { listOf(android.namespace!!) }
Lines changed: 36 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package io.sentry.android.gradle.extensions
22

33
import kotlin.test.assertFalse
4+
import kotlin.test.assertNull
45
import kotlin.test.assertTrue
56
import org.gradle.testfixtures.ProjectBuilder
67
import org.junit.Test
@@ -16,36 +17,62 @@ class SnapshotsExtensionTest {
1617
}
1718

1819
@Test
19-
fun `generateSnapshotTests is true by default`() {
20+
fun `previews generateTests is true by default`() {
2021
val project = ProjectBuilder.builder().build()
2122
val extension = project.objects.newInstance(SnapshotsExtension::class.java)
2223

23-
assertTrue(extension.generateSnapshotTests.get())
24+
assertTrue(extension.previews.generateTests.get())
2425
}
2526

2627
@Test
27-
fun `generateSnapshotTests can be set to false`() {
28+
fun `previews generateTests can be set to false`() {
2829
val project = ProjectBuilder.builder().build()
2930
val extension = project.objects.newInstance(SnapshotsExtension::class.java)
3031

31-
extension.generateSnapshotTests.set(false)
32+
extension.previews.generateTests.set(false)
3233

33-
assertFalse(extension.generateSnapshotTests.get())
34+
assertFalse(extension.previews.generateTests.get())
3435
}
3536

3637
@Test
37-
fun `includePrivatePreviews is true by default`() {
38+
fun `previews includePrivatePreviews is true by default`() {
3839
val project = ProjectBuilder.builder().build()
3940
val extension = project.objects.newInstance(SnapshotsExtension::class.java)
4041

41-
assertTrue(extension.includePrivatePreviews.get())
42+
assertTrue(extension.previews.includePrivatePreviews.get())
4243
}
4344

4445
@Test
45-
fun `packageTrees is empty by default`() {
46+
fun `previews packageTrees is empty by default`() {
4647
val project = ProjectBuilder.builder().build()
4748
val extension = project.objects.newInstance(SnapshotsExtension::class.java)
4849

49-
assertTrue(extension.packageTrees.get().isEmpty())
50+
assertTrue(extension.previews.packageTrees.get().isEmpty())
51+
}
52+
53+
@Test
54+
fun `previews theme has no default`() {
55+
val project = ProjectBuilder.builder().build()
56+
val extension = project.objects.newInstance(SnapshotsExtension::class.java)
57+
58+
assertNull(extension.previews.theme.orNull)
59+
}
60+
61+
@Test
62+
fun `previews block configures sub-extension`() {
63+
val project = ProjectBuilder.builder().build()
64+
val extension = project.objects.newInstance(SnapshotsExtension::class.java)
65+
66+
extension.previews { previews ->
67+
previews.generateTests.set(false)
68+
previews.includePrivatePreviews.set(false)
69+
previews.packageTrees.set(listOf("com.example"))
70+
previews.theme.set("AppTheme")
71+
}
72+
73+
assertFalse(extension.previews.generateTests.get())
74+
assertFalse(extension.previews.includePrivatePreviews.get())
75+
assertTrue(extension.previews.packageTrees.get() == listOf("com.example"))
76+
assertTrue(extension.previews.theme.get() == "AppTheme")
5077
}
5178
}

0 commit comments

Comments
 (0)