Skip to content

Commit d4f8fed

Browse files
committed
Cleanup
1 parent 06812b2 commit d4f8fed

File tree

12 files changed

+264
-376
lines changed

12 files changed

+264
-376
lines changed

paparazzi-annotations/src/main/java/app/cash/paparazzi/annotations/PaparazziPreviewData.kt

Lines changed: 55 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,11 @@ public sealed interface PaparazziPreviewData {
2222
val preview: PreviewData,
2323
val composable: @Composable () -> Unit
2424
) : PaparazziPreviewData {
25-
override fun toString(): String = buildList {
26-
add(snapshotName)
27-
preview.toString().takeIf { it.isNotEmpty() }?.let(::add)
28-
}.joinToString(",")
25+
override fun toString(): String =
26+
buildList {
27+
add(snapshotName)
28+
preview.toString().takeIf { it.isNotEmpty() }?.let(::add)
29+
}.joinToString(",")
2930
}
3031

3132
public data class Provider<T>(
@@ -34,13 +35,15 @@ public sealed interface PaparazziPreviewData {
3435
val composable: @Composable (T) -> Unit,
3536
val previewParameter: PreviewParameterData<T>
3637
) : PaparazziPreviewData {
37-
override fun toString(): String = buildList {
38-
add(snapshotName)
39-
preview.toString().takeIf { it.isNotEmpty() }?.let(::add)
40-
add(previewParameter.toString())
41-
}.joinToString(",")
38+
override fun toString(): String =
39+
buildList {
40+
add(snapshotName)
41+
preview.toString().takeIf { it.isNotEmpty() }?.let(::add)
42+
add(previewParameter.toString())
43+
}.joinToString(",")
4244

43-
public fun withPreviewParameterIndex(index: Int): Provider<T> = copy(previewParameter = previewParameter.copy(index = index))
45+
public fun withPreviewParameterIndex(index: Int): Provider<T> =
46+
copy(previewParameter = previewParameter.copy(index = index))
4447
}
4548

4649
public data object Empty : PaparazziPreviewData
@@ -50,10 +53,11 @@ public sealed interface PaparazziPreviewData {
5053
val preview: PreviewData,
5154
val message: String
5255
) : PaparazziPreviewData {
53-
override fun toString(): String = buildList {
54-
add(snapshotName)
55-
preview.toString().takeIf { it.isNotEmpty() }?.let(::add)
56-
}.joinToString(",")
56+
override fun toString(): String =
57+
buildList {
58+
add(snapshotName)
59+
preview.toString().takeIf { it.isNotEmpty() }?.let(::add)
60+
}.joinToString(",")
5761
}
5862
}
5963

@@ -66,22 +70,23 @@ public data class PreviewData(
6670
val locale: String? = null,
6771
val backgroundColor: String? = null
6872
) {
69-
override fun toString(): String = buildList {
70-
fontScale?.fontScale()?.displayName()?.let(::add)
71-
uiMode?.lightDarkName()?.let(::add)
72-
uiMode?.uiModeName()?.let(::add)
73-
device?.let {
74-
if (it != PaparazziPreviewDefaults.DEVICE_ID) {
75-
add(it.substringAfterLast(":"))
73+
override fun toString(): String =
74+
buildList {
75+
fontScale?.fontScale()?.displayName()?.let(::add)
76+
uiMode?.lightDarkName()?.let(::add)
77+
uiMode?.uiModeName()?.let(::add)
78+
device?.let {
79+
if (it != PaparazziPreviewDefaults.DEVICE_ID) {
80+
add(it.substringAfterLast(":"))
81+
}
7682
}
77-
}
78-
widthDp?.let { add("w_$it") }
79-
heightDp?.let { add("h_$it") }
80-
locale?.let(::add)
81-
backgroundColor?.let { add("bg_$it") }
82-
}.takeIf { it.isNotEmpty() }
83-
?.joinToString(",")
84-
?: ""
83+
widthDp?.let { add("w_$it") }
84+
heightDp?.let { add("h_$it") }
85+
locale?.let(::add)
86+
backgroundColor?.let { add("bg_$it") }
87+
}.takeIf { it.isNotEmpty() }
88+
?.joinToString(",")
89+
?: ""
8590
}
8691

8792
public data class PreviewParameterData<T>(
@@ -107,24 +112,27 @@ internal enum class FontScale(var value: Float?) {
107112
LARGEST(1.30f),
108113
CUSTOM(null);
109114

110-
fun displayName() = when (this) {
111-
CUSTOM -> "fs_$value"
112-
else -> name
113-
}
115+
fun displayName() =
116+
when (this) {
117+
CUSTOM -> "fs_$value"
118+
else -> name
119+
}
114120
}
115121

116-
internal fun Int.lightDarkName() = when (this and Configuration.UI_MODE_NIGHT_MASK) {
117-
Configuration.UI_MODE_NIGHT_NO -> "Light"
118-
Configuration.UI_MODE_NIGHT_YES -> "Dark"
119-
else -> null
120-
}
122+
internal fun Int.lightDarkName() =
123+
when (this and Configuration.UI_MODE_NIGHT_MASK) {
124+
Configuration.UI_MODE_NIGHT_NO -> "Light"
125+
Configuration.UI_MODE_NIGHT_YES -> "Dark"
126+
else -> null
127+
}
121128

122-
internal fun Int.uiModeName() = when (this and Configuration.UI_MODE_TYPE_MASK) {
123-
Configuration.UI_MODE_TYPE_NORMAL -> "Normal"
124-
Configuration.UI_MODE_TYPE_CAR -> "Car"
125-
Configuration.UI_MODE_TYPE_DESK -> "Desk"
126-
Configuration.UI_MODE_TYPE_APPLIANCE -> "Appliance"
127-
Configuration.UI_MODE_TYPE_WATCH -> "Watch"
128-
Configuration.UI_MODE_TYPE_VR_HEADSET -> "VR_Headset"
129-
else -> null
130-
}
129+
internal fun Int.uiModeName() =
130+
when (this and Configuration.UI_MODE_TYPE_MASK) {
131+
Configuration.UI_MODE_TYPE_NORMAL -> "Normal"
132+
Configuration.UI_MODE_TYPE_CAR -> "Car"
133+
Configuration.UI_MODE_TYPE_DESK -> "Desk"
134+
Configuration.UI_MODE_TYPE_APPLIANCE -> "Appliance"
135+
Configuration.UI_MODE_TYPE_WATCH -> "Watch"
136+
Configuration.UI_MODE_TYPE_VR_HEADSET -> "VR_Headset"
137+
else -> null
138+
}
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
package app.cash.paparazzi.gradle
2+
3+
import org.gradle.api.DefaultTask
4+
import org.gradle.api.file.DirectoryProperty
5+
import org.gradle.api.file.RegularFileProperty
6+
import org.gradle.api.provider.Property
7+
import org.gradle.api.tasks.CacheableTask
8+
import org.gradle.api.tasks.Input
9+
import org.gradle.api.tasks.InputFile
10+
import org.gradle.api.tasks.Optional
11+
import org.gradle.api.tasks.OutputDirectory
12+
import org.gradle.api.tasks.OutputFile
13+
import org.gradle.api.tasks.PathSensitive
14+
import org.gradle.api.tasks.PathSensitivity
15+
import org.gradle.api.tasks.SkipWhenEmpty
16+
import org.gradle.api.tasks.TaskAction
17+
18+
@CacheableTask
19+
public abstract class GeneratePreviewTestFileTask: DefaultTask() {
20+
@get:Input
21+
public abstract val namespace: Property<String>
22+
23+
@get:Optional
24+
@get:SkipWhenEmpty
25+
@get:InputFile
26+
@get:PathSensitive(PathSensitivity.NONE)
27+
public abstract val paparazziPreviewsFile: RegularFileProperty
28+
29+
@get:OutputDirectory
30+
public abstract val previewTestOutputDir: DirectoryProperty
31+
32+
@get:OutputFile
33+
public abstract val previewTestOutputFile: RegularFileProperty
34+
35+
@TaskAction
36+
public fun createFile() {
37+
val previewDataFile = paparazziPreviewsFile.asFile.get()
38+
val previewTestFile = previewTestOutputFile.asFile.get()
39+
40+
if (!previewDataFile.exists()) {
41+
logger.warn("Preview data file not found: $previewDataFile")
42+
return
43+
}
44+
45+
previewTestFile.writeText(previewTestSource(namespace.get()))
46+
}
47+
}

paparazzi-gradle-plugin/src/main/java/app/cash/paparazzi/gradle/PaparazziPlugin.kt

Lines changed: 0 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -30,15 +30,6 @@ import com.android.build.api.variant.LibraryAndroidComponentsExtension
3030
import com.android.build.gradle.BaseExtension
3131
import com.google.devtools.ksp.gradle.KspExtension
3232
import com.google.devtools.ksp.gradle.KspGradleSubplugin
33-
import com.android.build.gradle.LibraryExtension
34-
import com.android.build.gradle.TestedExtension
35-
import com.android.build.gradle.api.BaseVariant
36-
import com.android.build.gradle.internal.api.TestedVariant
37-
import com.android.build.gradle.internal.dsl.BaseAppModuleExtension
38-
import com.android.build.gradle.internal.dsl.DynamicFeatureExtension
39-
import com.android.build.gradle.internal.publishing.AndroidArtifacts.ArtifactType
40-
import com.google.devtools.ksp.gradle.KspExtension
41-
import com.google.devtools.ksp.gradle.KspGradleSubplugin
4233
import org.gradle.api.DefaultTask
4334
import org.gradle.api.Plugin
4435
import org.gradle.api.Project
@@ -405,37 +396,6 @@ public class PaparazziPlugin @Inject constructor(
405396
configurations.getByName("testImplementation").dependencies.add(dependency)
406397
}
407398

408-
private fun Project.addAnnotationsDependency() {
409-
val dependency = if (isInternal()) {
410-
dependencies.project(mapOf("path" to ":paparazzi-annotations"))
411-
} else {
412-
dependencies.create("app.cash.paparazzi:paparazzi-annotations:$VERSION")
413-
}
414-
configurations.getByName("implementation").dependencies.add(dependency)
415-
}
416-
417-
private fun Project.addProcessorDependency() {
418-
val dependency = if (isInternal()) {
419-
dependencies.project(mapOf("path" to ":paparazzi-preview-processor"))
420-
} else {
421-
dependencies.create("app.cash.paparazzi:paparazzi-preview-processor:$VERSION")
422-
}
423-
if (project.plugins.hasPlugin("org.jetbrains.kotlin.multiplatform")) {
424-
configurations.getByName("kspCommonMainMetadata").dependencies.add(dependency)
425-
} else {
426-
configurations.getByName("ksp").dependencies.add(dependency)
427-
}
428-
}
429-
430-
private fun Project.addPreviewTestDependency() {
431-
val dependency = if (isInternal()) {
432-
dependencies.project(mapOf("path" to ":paparazzi-preview-test-junit"))
433-
} else {
434-
dependencies.create("app.cash.paparazzi:paparazzi-preview-test-junit:$VERSION")
435-
}
436-
configurations.getByName("testImplementation").dependencies.add(dependency)
437-
}
438-
439399
private fun Project.isInternal(): Boolean = providers.gradleProperty("app.cash.paparazzi.internal").orNull == "true"
440400

441401
private fun BaseExtension.packageName(): String = namespace ?: ""

paparazzi-gradle-plugin/src/main/java/app/cash/paparazzi/gradle/PreviewTests.kt

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
package app.cash.paparazzi.gradle
22

3-
internal const val PREVIEW_TEST_SOURCE = """
3+
internal fun previewTestSource(
4+
packageName: String,
5+
) = """
6+
package $packageName
7+
48
import app.cash.paparazzi.Paparazzi
59
import app.cash.paparazzi.annotations.PaparazziPreviewData
610
import app.cash.paparazzi.preview.DefaultLocaleRule
Lines changed: 13 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package app.cash.paparazzi.gradle.utils
22

3-
import app.cash.paparazzi.gradle.PREVIEW_TEST_SOURCE
3+
import app.cash.paparazzi.gradle.GeneratePreviewTestFileTask
44
import com.android.build.api.variant.AndroidComponentsExtension
55
import com.android.build.api.variant.HasUnitTest
66
import org.gradle.api.Project
@@ -22,7 +22,7 @@ internal fun Project.registerGeneratePreviewTask(extension: AndroidComponentsExt
2222
val buildTypeCap = testVariant.buildType?.capitalize()
2323

2424
val taskName = "paparazziGeneratePreview${testVariantSlug}Kotlin"
25-
val taskProvider = tasks.register(taskName) { task ->
25+
val taskProvider = tasks.register(taskName, GeneratePreviewTestFileTask::class.java) { task ->
2626
task.group = VERIFICATION_GROUP
2727
task.description =
2828
"Generates the preview test class to the test source set for $testVariantSlug"
@@ -51,70 +51,24 @@ internal fun Project.registerGeneratePreviewTask(extension: AndroidComponentsExt
5151
val namespaceDir = namespace.replace(".", File.separator)
5252
val previewTestDir = "$testSourceDir${File.separator}$namespaceDir"
5353

54-
// Optional input if KSP doesn't output preview annotation file
55-
task.inputs
56-
.file(
57-
"$projectDir${File.separator}$KSP_SOURCE_DIR${File.separator}${buildType}${File.separator}kotlin${File.separator}$namespaceDir${File.separator}$PREVIEW_DATA_FILE"
58-
)
59-
.optional()
60-
.skipWhenEmpty()
61-
6254
// Defaulted to true unless specified in properties
6355
task.enabled = project.providers.gradleProperty(
6456
"app.cash.paparazzi.annotation.generateTestClass"
6557
).orNull?.toBoolean() != false
6658

67-
task.outputs.dir(previewTestDir)
68-
task.outputs.file("$previewTestDir${File.separator}$PREVIEW_TEST_FILE")
69-
task.outputs.cacheIf { true }
70-
71-
// test compilation depends on the task
72-
project.tasks.named {
73-
it == "compile${testVariantSlug}Kotlin" ||
74-
it == "generate${testVariantSlug}LintModel" ||
75-
it == "lintAnalyze$testVariantSlug"
76-
}.configureEach { it.dependsOn(taskProvider) }
77-
// run task before processing symbols
78-
project.tasks.named { it == "ksp${testVariantSlug}Kotlin" }
79-
.configureEach { it.mustRunAfter(taskProvider) }
80-
81-
gradle.taskGraph.whenReady {
82-
taskProvider.configure { task ->
83-
// Test variant appends .test to the namespace
84-
val namespace = testVariant.namespace.get().replace(".test$".toRegex(), "")
85-
val namespaceDir = namespace.replace(".", File.separator)
86-
val previewTestDir = "$testSourceDir${File.separator}$namespaceDir"
87-
88-
// Optional input if KSP doesn't output preview annotation file
89-
task.inputs
90-
.file(
91-
"$projectDir${File.separator}$KSP_SOURCE_DIR${File.separator}${buildType}${File.separator}kotlin${File.separator}$namespaceDir${File.separator}$PREVIEW_DATA_FILE"
92-
)
93-
.optional()
94-
.skipWhenEmpty()
95-
96-
task.outputs.dir(previewTestDir)
97-
task.outputs.file("$previewTestDir${File.separator}$PREVIEW_TEST_FILE")
98-
task.outputs.cacheIf { true }
99-
100-
// test compilation depends on the task
101-
tasks.findByName("compile${buildTypeCap}UnitTestKotlin")?.dependsOn(taskName)
102-
// run task before processing symbols
103-
tasks.findByName("ksp${buildTypeCap}UnitTestKotlin")?.mustRunAfter(taskName)
104-
105-
task.doLast {
106-
File(previewTestDir).mkdirs()
107-
File(previewTestDir, PREVIEW_TEST_FILE).writeText(
108-
buildString {
109-
appendLine("package $namespace")
110-
append(PREVIEW_TEST_SOURCE)
111-
}
112-
)
113-
}
59+
// Optional input if KSP doesn't output preview annotation file
60+
task.paparazziPreviewsFile.set(File(
61+
"$projectDir${File.separator}$KSP_SOURCE_DIR${File.separator}${buildType}${File.separator}kotlin${File.separator}$namespaceDir${File.separator}$PREVIEW_DATA_FILE"
62+
))
63+
task.namespace.set(namespace)
64+
65+
// Outputs
66+
task.previewTestOutputDir.set(File(previewTestDir))
67+
task.previewTestOutputFile.set(File("$previewTestDir${File.separator}$PREVIEW_TEST_FILE"))
11468
}
11569
}
11670
}
11771
}
11872

119-
private fun String.capitalize() =
120-
replaceFirstChar { if (it.isLowerCase()) it.titlecase(Locale.ROOT) else it.toString() }
73+
private fun String.capitalize() =
74+
replaceFirstChar { if (it.isLowerCase()) it.titlecase(Locale.ROOT) else it.toString() }

0 commit comments

Comments
 (0)