Skip to content

Commit

Permalink
Merge remote-tracking branch 'upstream/master' into layoutlib
Browse files Browse the repository at this point in the history
  • Loading branch information
gabrielittner committed Jan 24, 2024
2 parents 3c38a18 + 1942aa9 commit 0a38d7e
Show file tree
Hide file tree
Showing 87 changed files with 368 additions and 4,277 deletions.
4 changes: 2 additions & 2 deletions .github/workflows/requirements.txt
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,10 @@ Jinja2==3.1.3
livereload==2.6.3
lunr==0.7.0.post1
Markdown<3.6
MarkupSafe==2.1.3
MarkupSafe==2.1.4
mkdocs==1.5.3
mkdocs-macros-plugin==1.0.5
mkdocs-material==9.5.4
mkdocs-material==9.5.5
mkdocs-material-extensions==1.3.1
Pygments==2.17.2
pymdown-extensions==10.7
Expand Down
2 changes: 0 additions & 2 deletions gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -28,5 +28,3 @@ android.suppressUnsupportedCompileSdk=UpsideDownCakePrivacySandbox

# Signals to our own plugin that we are building within the repo.
app.cash.paparazzi.internal=true

#app.cash.paparazzi.legacy.resource.loading=true
6 changes: 3 additions & 3 deletions gradle/libs.versions.toml
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ trove4j = { module = "org.jetbrains.intellij.deps:trove4j", version = "1.0.20200
# Test libraries
junit = { module = "junit:junit", version = "4.13.2" }
testParameterInjector = { module = "com.google.testparameterinjector:test-parameter-injector", version = "1.15" }
truth = { module = "com.google.truth:truth", version = "1.2.0" }
truth = { module = "com.google.truth:truth", version = "1.3.0" }

# Plugins
plugin-android = { module = "com.android.tools.build:gradle", version.ref = "agp" }
Expand All @@ -71,5 +71,5 @@ plugin-dokka = { module = "org.jetbrains.dokka:dokka-gradle-plugin", version = "
plugin-kotlin = { module = "org.jetbrains.kotlin:kotlin-gradle-plugin", version.ref = "kotlin" }
plugin-ksp = { module = "com.google.devtools.ksp:com.google.devtools.ksp.gradle.plugin", version.ref = "ksp" }
plugin-mavenPublish = { module = "com.vanniktech:gradle-maven-publish-plugin", version = "0.27.0" }
plugin-spotless = { module = "com.diffplug.spotless:spotless-plugin-gradle", version = "6.24.0" }
plugin-versions = { module = "com.github.ben-manes:gradle-versions-plugin", version = "0.50.0" }
plugin-spotless = { module = "com.diffplug.spotless:spotless-plugin-gradle", version = "6.25.0" }
plugin-versions = { module = "com.github.ben-manes:gradle-versions-plugin", version = "0.51.0" }
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ package app.cash.paparazzi.gradle

import app.cash.paparazzi.gradle.utils.artifactViewFor
import app.cash.paparazzi.gradle.utils.artifactsFor
import app.cash.paparazzi.gradle.utils.relativize
import com.android.build.gradle.BaseExtension
import com.android.build.gradle.LibraryExtension
import com.android.build.gradle.TestedExtension
Expand All @@ -25,24 +26,19 @@ 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.android.build.gradle.tasks.MergeSourceSetFolders
import org.gradle.api.DefaultTask
import org.gradle.api.DomainObjectSet
import org.gradle.api.Plugin
import org.gradle.api.Project
import org.gradle.api.artifacts.component.ProjectComponentIdentifier
import org.gradle.api.artifacts.type.ArtifactTypeDefinition
import org.gradle.api.artifacts.type.ArtifactTypeDefinition.ARTIFACT_TYPE_ATTRIBUTE
import org.gradle.api.file.Directory
import org.gradle.api.file.DirectoryProperty
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.plugins.JavaBasePlugin
import org.gradle.api.provider.Provider
import org.gradle.api.reporting.ReportingExtension
import org.gradle.api.tasks.PathSensitivity
import org.gradle.api.tasks.TaskProvider
import org.gradle.api.tasks.options.Option
import org.gradle.api.tasks.testing.Test
import org.gradle.internal.os.OperatingSystem
Expand All @@ -52,49 +48,27 @@ import org.jetbrains.kotlin.gradle.plugin.KotlinAndroidPluginWrapper
import org.jetbrains.kotlin.gradle.plugin.KotlinMultiplatformPluginWrapper
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinAndroidTarget
import java.util.Locale
import kotlin.io.path.invariantSeparatorsPathString

@Suppress("unused")
class PaparazziPlugin : Plugin<Project> {
override fun apply(project: Project) {
val legacyResourceLoadingEnabled = (project.findProperty("app.cash.paparazzi.legacy.resource.loading") as? String)?.toBoolean() ?: false

if (legacyResourceLoadingEnabled) {
project.afterEvaluate {
check(!project.plugins.hasPlugin("com.android.application")) {
error(
"Currently, Paparazzi only works in Android library -- not application -- modules. " +
"See https://github.com/cashapp/paparazzi/issues/107"
)
}

check(project.plugins.hasPlugin("com.android.library")) {
"The Android Gradle library plugin must be applied for Paparazzi to work properly."
}
}

project.plugins.withId("com.android.library") {
setupPaparazzi(project, project.extensions.getByType(LibraryExtension::class.java).libraryVariants)
}
} else {
val supportedPlugins = listOf("com.android.application", "com.android.library", "com.android.dynamic-feature")
project.afterEvaluate {
check(supportedPlugins.any { project.plugins.hasPlugin(it) }) {
"One of ${supportedPlugins.joinToString(", ")} must be applied for Paparazzi to work properly."
}
val supportedPlugins = listOf("com.android.application", "com.android.library", "com.android.dynamic-feature")
project.afterEvaluate {
check(supportedPlugins.any { project.plugins.hasPlugin(it) }) {
"One of ${supportedPlugins.joinToString(", ")} must be applied for Paparazzi to work properly."
}
}

supportedPlugins.forEach { plugin ->
project.plugins.withId(plugin) {
val variants = when (val extension = project.extensions.getByType(TestedExtension::class.java)) {
is LibraryExtension -> extension.libraryVariants
is BaseAppModuleExtension -> extension.applicationVariants
is DynamicFeatureExtension -> extension.applicationVariants
// exhaustive to avoid potential breaking changes in future AGP releases
else -> throw IllegalStateException("${extension.javaClass.name} from $plugin is not supported in Paparazzi")
}
setupPaparazzi(project, variants)
supportedPlugins.forEach { plugin ->
project.plugins.withId(plugin) {
val variants = when (val extension = project.extensions.getByType(TestedExtension::class.java)) {
is LibraryExtension -> extension.libraryVariants
is BaseAppModuleExtension -> extension.applicationVariants
is DynamicFeatureExtension -> extension.applicationVariants
// exhaustive to avoid potential breaking changes in future AGP releases
else -> error("${extension.javaClass.name} from $plugin is not supported in Paparazzi")
}
setupPaparazzi(project, variants)
}
}
}
Expand All @@ -117,10 +91,6 @@ class PaparazziPlugin : Plugin<Project> {
val variantSlug = variant.name.capitalize(Locale.US)
val testVariant = variant.unitTestVariant ?: return@all

val mergeResourcesOutputDir = variant.mergeResourcesProvider.flatMap { it.outputDir }
val mergeAssetsProvider =
project.tasks.named("merge${variantSlug}Assets") as TaskProvider<MergeSourceSetFolders>
val mergeAssetsOutputDir = mergeAssetsProvider.flatMap { it.outputDir }
val projectDirectory = project.layout.projectDirectory
val buildDirectory = project.layout.buildDirectory
val gradleUserHomeDir = project.gradle.gradleUserHomeDir
Expand Down Expand Up @@ -168,14 +138,12 @@ class PaparazziPlugin : Plugin<Project> {
task.packageName.set(android.packageName())
task.artifactFiles.from(packageAwareArtifactFiles)
task.nonTransitiveRClassEnabled.set(nonTransitiveRClassEnabled)
task.mergeResourcesOutputDir.set(buildDirectory.asRelativePathString(mergeResourcesOutputDir))
task.targetSdkVersion.set(android.targetSdkVersion())
task.compileSdkVersion.set(android.compileSdkVersion())
task.mergeAssetsOutputDir.set(buildDirectory.asRelativePathString(mergeAssetsOutputDir))
task.projectResourceDirs.from(localResourceDirs)
task.moduleResourceDirs.from(moduleResourceDirs)
task.projectResourceDirs.set(localResourceDirs.relativize(projectDirectory))
task.moduleResourceDirs.set(moduleResourceDirs.relativize(projectDirectory))
task.aarExplodedDirs.from(aarExplodedDirs)
task.projectAssetDirs.from(localAssetDirs.plus(moduleAssetDirs))
task.projectAssetDirs.set(localAssetDirs.plus(moduleAssetDirs).relativize(projectDirectory))
task.aarAssetDirs.from(aarAssetDirs)
task.paparazziResources.set(buildDirectory.file("intermediates/paparazzi/${variant.name}/resources.json"))
}
Expand Down Expand Up @@ -234,8 +202,18 @@ class PaparazziPlugin : Plugin<Project> {
test.inputs.property("paparazzi.test.record", isRecordRun)
test.inputs.property("paparazzi.test.verify", isVerifyRun)

test.inputs.dir(mergeResourcesOutputDir)
test.inputs.dir(mergeAssetsOutputDir)
test.inputs.files(localResourceDirs)
.withPropertyName("paparazzi.localResourceDirs")
.withPathSensitivity(PathSensitivity.RELATIVE)
test.inputs.files(moduleResourceDirs)
.withPropertyName("paparazzi.moduleResourceDirs")
.withPathSensitivity(PathSensitivity.RELATIVE)
test.inputs.files(localAssetDirs)
.withPropertyName("paparazzi.localAssetDirs")
.withPathSensitivity(PathSensitivity.RELATIVE)
test.inputs.files(moduleAssetDirs)
.withPropertyName("paparazzi.moduleAssetDirs")
.withPathSensitivity(PathSensitivity.RELATIVE)
test.inputs.files(nativePlatformFileCollection)
.withPropertyName("paparazzi.nativePlatform")
.withPathSensitivity(PathSensitivity.NONE)
Expand Down Expand Up @@ -323,11 +301,4 @@ class PaparazziPlugin : Plugin<Project> {
}
}

private fun Directory.relativize(child: Directory): String {
return asFile.toPath().relativize(child.asFile.toPath()).invariantSeparatorsPathString
}

private fun DirectoryProperty.asRelativePathString(child: Provider<Directory>): Provider<String> =
flatMap { root -> child.map { root.relativize(it) } }

private const val DEFAULT_COMPILE_SDK_VERSION = 34
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ import com.squareup.moshi.Moshi
import org.gradle.api.DefaultTask
import org.gradle.api.file.ConfigurableFileCollection
import org.gradle.api.file.RegularFileProperty
import org.gradle.api.provider.ListProperty
import org.gradle.api.provider.Property
import org.gradle.api.tasks.CacheableTask
import org.gradle.api.tasks.Input
Expand All @@ -35,40 +36,29 @@ abstract class PrepareResourcesTask : DefaultTask() {
@get:Input
abstract val packageName: Property<String>

@Deprecated("legacy resource loading, to be removed in a future release")
@get:Input
abstract val mergeResourcesOutputDir: Property<String>

@get:Input
abstract val targetSdkVersion: Property<String>

@get:Input
abstract val compileSdkVersion: Property<String>

@get:InputFiles
@get:PathSensitive(PathSensitivity.RELATIVE)
abstract val projectResourceDirs: ConfigurableFileCollection
@get:Input
abstract val projectResourceDirs: ListProperty<String>

@get:InputFiles
@get:PathSensitive(PathSensitivity.RELATIVE)
abstract val moduleResourceDirs: ConfigurableFileCollection
@get:Input
abstract val moduleResourceDirs: ListProperty<String>

@get:InputFiles
@get:PathSensitive(PathSensitivity.RELATIVE)
abstract val aarExplodedDirs: ConfigurableFileCollection

@get:InputFiles
@get:PathSensitive(PathSensitivity.RELATIVE)
abstract val projectAssetDirs: ConfigurableFileCollection
@get:Input
abstract val projectAssetDirs: ListProperty<String>

@get:InputFiles
@get:PathSensitive(PathSensitivity.RELATIVE)
abstract val aarAssetDirs: ConfigurableFileCollection

@Deprecated("legacy asset loading, to be removed in a future release")
@get:Input
abstract val mergeAssetsOutputDir: Property<String>

@get:Input
abstract val nonTransitiveRClassEnabled: Property<Boolean>

Expand All @@ -84,8 +74,6 @@ abstract class PrepareResourcesTask : DefaultTask() {
private val gradleUserHomeDirectory = projectDirectory.dir(project.gradle.gradleUserHomeDir.path)

@TaskAction
// TODO: figure out why this can't be removed as of Kotlin 1.6+
@OptIn(ExperimentalStdlibApi::class)
fun writeResourcesFile() {
val out = paparazziResources.get().asFile
out.delete()
Expand All @@ -104,16 +92,14 @@ abstract class PrepareResourcesTask : DefaultTask() {

val config = Config(
mainPackage = mainPackage,
mergeResourcesOutputDir = mergeResourcesOutputDir.get(),
targetSdkVersion = targetSdkVersion.get(),
// Use compileSdkVersion for system framework resources.
platformDir = "platforms/android-${compileSdkVersion.get()}/",
mergeAssetsOutputDir = mergeAssetsOutputDir.get(),
resourcePackageNames = resourcePackageNames,
projectResourceDirs = projectResourceDirs.relativize(projectDirectory),
moduleResourceDirs = moduleResourceDirs.relativize(projectDirectory),
projectResourceDirs = projectResourceDirs.get(),
moduleResourceDirs = moduleResourceDirs.get(),
aarExplodedDirs = aarExplodedDirs.relativize(gradleUserHomeDirectory),
projectAssetDirs = projectAssetDirs.relativize(projectDirectory),
projectAssetDirs = projectAssetDirs.get(),
aarAssetDirs = aarAssetDirs.relativize(gradleUserHomeDirectory)
)
val moshi = Moshi.Builder().build()!!
Expand All @@ -124,10 +110,8 @@ abstract class PrepareResourcesTask : DefaultTask() {
@JsonClass(generateAdapter = true)
data class Config(
val mainPackage: String,
val mergeResourcesOutputDir: String,
val targetSdkVersion: String,
val platformDir: String,
val mergeAssetsOutputDir: String,
val resourcePackageNames: List<String>,
val projectResourceDirs: List<String>,
val moduleResourceDirs: List<String>,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,11 +15,11 @@
*/
package app.cash.paparazzi.gradle.utils

import org.gradle.api.file.ConfigurableFileCollection
import org.gradle.api.file.Directory
import org.gradle.api.file.FileCollection
import java.io.File

fun ConfigurableFileCollection.relativize(directory: Directory) = files.map(directory::relativize)
fun FileCollection.relativize(directory: Directory) = files.map(directory::relativize)

fun Directory.relativize(child: File): String {
return asFile.toPath().relativize(child.toPath()).toFile().invariantSeparatorsPath
Expand Down
Loading

0 comments on commit 0a38d7e

Please sign in to comment.