Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Pull out SDK into its own module #1462

Draft
wants to merge 1 commit into
base: master
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions gradle/libs.versions.toml
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ androidx-annotations = { module = "androidx.annotation:annotation", version = "1
androidx-appcompat = { module = "androidx.appcompat:appcompat", version = "1.7.0" }
androidx-activity = { module = "androidx.activity:activity", version = "1.9.0" }
androidx-compose-ui-android = { module = "androidx.compose.ui:ui-android", version = "1.6.7" }
androidx-compose-runtime = { module = "androidx.compose.runtime:runtime", version = "1.6.7" }
androidx-recyclerview = { module = "androidx.recyclerview:recyclerview", version = "1.3.2" }

bytebuddy-agent = { module = "net.bytebuddy:byte-buddy-agent", version.ref = "bytebuddy" }
Expand Down
3 changes: 2 additions & 1 deletion paparazzi-gradle-plugin/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,8 @@ buildConfig {
}

tasks.withType(Test).configureEach {
dependsOn(':paparazzi:publishMavenPublicationToProjectLocalMavenRepository')
dependsOn(':paparazzi-junit4:publishMavenPublicationToProjectLocalMavenRepository')
dependsOn(':paparazzi-sdk:publishMavenPublicationToProjectLocalMavenRepository')
}

// When cleaning this project, we also want to clean the test projects.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -329,7 +329,7 @@ public class PaparazziPlugin : Plugin<Project> {

private fun Project.addTestDependency() {
val dependency = if (isInternal()) {
dependencies.project(mapOf("path" to ":paparazzi"))
dependencies.project(mapOf("path" to ":paparazzi-junit4"))
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

deliberate for now. can query gradle extension config for junit4 vs junit5, but not sure how to keep it generic for other 3rd party wrappers.

} else {
dependencies.create("app.cash.paparazzi:paparazzi:$VERSION")
}
Expand Down
45 changes: 45 additions & 0 deletions paparazzi-junit4/api/paparazzi-junit4.api
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
public final class app/cash/paparazzi/InstantAnimationsRule : org/junit/rules/TestRule {
public static final field $stable I
public fun <init> ()V
public fun apply (Lorg/junit/runners/model/Statement;Lorg/junit/runner/Description;)Lorg/junit/runners/model/Statement;
}

public final class app/cash/paparazzi/Paparazzi : org/junit/rules/TestRule {
public static final field $stable I
public fun <init> ()V
public fun <init> (Lapp/cash/paparazzi/Environment;)V
public fun <init> (Lapp/cash/paparazzi/Environment;Lapp/cash/paparazzi/DeviceConfig;)V
public fun <init> (Lapp/cash/paparazzi/Environment;Lapp/cash/paparazzi/DeviceConfig;Ljava/lang/String;)V
public fun <init> (Lapp/cash/paparazzi/Environment;Lapp/cash/paparazzi/DeviceConfig;Ljava/lang/String;Lcom/android/ide/common/rendering/api/SessionParams$RenderingMode;)V
public fun <init> (Lapp/cash/paparazzi/Environment;Lapp/cash/paparazzi/DeviceConfig;Ljava/lang/String;Lcom/android/ide/common/rendering/api/SessionParams$RenderingMode;Z)V
public fun <init> (Lapp/cash/paparazzi/Environment;Lapp/cash/paparazzi/DeviceConfig;Ljava/lang/String;Lcom/android/ide/common/rendering/api/SessionParams$RenderingMode;ZD)V
public fun <init> (Lapp/cash/paparazzi/Environment;Lapp/cash/paparazzi/DeviceConfig;Ljava/lang/String;Lcom/android/ide/common/rendering/api/SessionParams$RenderingMode;ZDLapp/cash/paparazzi/SnapshotHandler;)V
public fun <init> (Lapp/cash/paparazzi/Environment;Lapp/cash/paparazzi/DeviceConfig;Ljava/lang/String;Lcom/android/ide/common/rendering/api/SessionParams$RenderingMode;ZDLapp/cash/paparazzi/SnapshotHandler;Ljava/util/Set;)V
public fun <init> (Lapp/cash/paparazzi/Environment;Lapp/cash/paparazzi/DeviceConfig;Ljava/lang/String;Lcom/android/ide/common/rendering/api/SessionParams$RenderingMode;ZDLapp/cash/paparazzi/SnapshotHandler;Ljava/util/Set;Z)V
public fun <init> (Lapp/cash/paparazzi/Environment;Lapp/cash/paparazzi/DeviceConfig;Ljava/lang/String;Lcom/android/ide/common/rendering/api/SessionParams$RenderingMode;ZDLapp/cash/paparazzi/SnapshotHandler;Ljava/util/Set;ZZ)V
public fun <init> (Lapp/cash/paparazzi/Environment;Lapp/cash/paparazzi/DeviceConfig;Ljava/lang/String;Lcom/android/ide/common/rendering/api/SessionParams$RenderingMode;ZDLapp/cash/paparazzi/SnapshotHandler;Ljava/util/Set;ZZZ)V
public fun <init> (Lapp/cash/paparazzi/Environment;Lapp/cash/paparazzi/DeviceConfig;Ljava/lang/String;Lcom/android/ide/common/rendering/api/SessionParams$RenderingMode;ZDLapp/cash/paparazzi/SnapshotHandler;Ljava/util/Set;ZZZZ)V
public synthetic fun <init> (Lapp/cash/paparazzi/Environment;Lapp/cash/paparazzi/DeviceConfig;Ljava/lang/String;Lcom/android/ide/common/rendering/api/SessionParams$RenderingMode;ZDLapp/cash/paparazzi/SnapshotHandler;Ljava/util/Set;ZZZZILkotlin/jvm/internal/DefaultConstructorMarker;)V
public fun apply (Lorg/junit/runners/model/Statement;Lorg/junit/runner/Description;)Lorg/junit/runners/model/Statement;
public final fun close ()V
public final fun getContext ()Landroid/content/Context;
public final fun getLayoutInflater ()Landroid/view/LayoutInflater;
public final fun getResources ()Landroid/content/res/Resources;
public final fun gif (Landroid/view/View;)V
public final fun gif (Landroid/view/View;Ljava/lang/String;)V
public final fun gif (Landroid/view/View;Ljava/lang/String;J)V
public final fun gif (Landroid/view/View;Ljava/lang/String;JJ)V
public final fun gif (Landroid/view/View;Ljava/lang/String;JJI)V
public static synthetic fun gif$default (Lapp/cash/paparazzi/Paparazzi;Landroid/view/View;Ljava/lang/String;JJIILjava/lang/Object;)V
public final fun inflate (I)Landroid/view/View;
public final fun prepare (Lorg/junit/runner/Description;)V
public final fun snapshot (Landroid/view/View;)V
public final fun snapshot (Landroid/view/View;Ljava/lang/String;)V
public final fun snapshot (Landroid/view/View;Ljava/lang/String;J)V
public final fun snapshot (Ljava/lang/String;Lkotlin/jvm/functions/Function2;)V
public static synthetic fun snapshot$default (Lapp/cash/paparazzi/Paparazzi;Landroid/view/View;Ljava/lang/String;JILjava/lang/Object;)V
public static synthetic fun snapshot$default (Lapp/cash/paparazzi/Paparazzi;Ljava/lang/String;Lkotlin/jvm/functions/Function2;ILjava/lang/Object;)V
public final fun unsafeUpdateConfig (Lapp/cash/paparazzi/DeviceConfig;Ljava/lang/String;Lcom/android/ide/common/rendering/api/SessionParams$RenderingMode;)V
public static synthetic fun unsafeUpdateConfig$default (Lapp/cash/paparazzi/Paparazzi;Lapp/cash/paparazzi/DeviceConfig;Ljava/lang/String;Lcom/android/ide/common/rendering/api/SessionParams$RenderingMode;ILjava/lang/Object;)V
}

129 changes: 129 additions & 0 deletions paparazzi-junit4/build.gradle
Original file line number Diff line number Diff line change
@@ -0,0 +1,129 @@
import com.android.build.gradle.internal.publishing.AndroidArtifacts

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

configurations {
layoutlibRuntime {
canBeConsumed = false
attributes.attribute(AndroidArtifacts.ARTIFACT_TYPE, ArtifactTypeDefinition.DIRECTORY_TYPE)
}
layoutlibResources {
canBeConsumed = false
attributes.attribute(AndroidArtifacts.ARTIFACT_TYPE, ArtifactTypeDefinition.DIRECTORY_TYPE)
}
}

aar2jar.configureForConfiguration("compileOnly")
aar2jar.configureForConfiguration("testImplementation")

dependencies {
registerTransform(org.gradle.api.internal.artifacts.transform.UnzipTransform) {
from.attribute(AndroidArtifacts.ARTIFACT_TYPE, ArtifactTypeDefinition.JAR_TYPE)
to.attribute(AndroidArtifacts.ARTIFACT_TYPE, ArtifactTypeDefinition.DIRECTORY_TYPE)
}
}

dependencies {
testImplementationAarAsJar libs.androidx.compose.ui.android
compileOnlyAarAsJar libs.androidx.compose.ui.android
compileOnlyAarAsJar libs.androidx.compose.runtime
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

calling out this switcheroo; replacing compileOnlyAarAsJar libs.androidx.activity with this: https://github.com/cashapp/paparazzi/pull/1462/files#diff-697f70cdd88ba88fe77eebda60c7e143f6ad1286bca75017421e93ad84fb87df

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nice, much better dependency

api projects.paparazziSdk
api libs.junit
api platform(libs.kotlin.bom)

def osName = System.getProperty("os.name").toLowerCase(Locale.US)
def osLabel
if (osName.startsWith("mac")) {
def osArch = System.getProperty("os.arch").toLowerCase(Locale.US)
if (osArch.startsWith("x86")) {
osLabel = 'mac'
} else {
osLabel = 'mac-arm'
}
} else if (osName.startsWith("windows")) {
osLabel = 'win'
} else {
osLabel = 'linux'
}
layoutlibRuntime variantOf(libs.tools.layoutlib.runtime) { classifier(osLabel) }
layoutlibResources libs.tools.layoutlib.resources

testImplementation libs.truth
}

tasks.named("dokkaGfm").configure {
outputDirectory = rootProject.file("docs/1.x")
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Amazing that you did all this while keeping 1.x 👏🏻


dokkaSourceSets.named("main") {
configureEach {
reportUndocumented = false
skipDeprecated = true
jdkVersion = 8
perPackageOption {
prefix = "app.cash.paparazzi.internal"
suppress = true
}
}
}
}

def generateTestConfig = tasks.register("generateTestConfig") {
def resources = layout.buildDirectory.file('intermediates/paparazzi/resources.json')
outputs.file(resources)

doLast {
File configFile = resources.get().asFile
configFile.write("""{
"mainPackage": "app.cash.paparazzi",
"mergeResourcesOutputDir": ".",
"targetSdkVersion": "34",
"mergeAssetsOutputDir": ".",
"resourcePackageNames": ["app.cash.paparazzi"],
"projectResourceDirs": [],
"moduleResourceDirs": [],
"aarExplodedDirs": [],
"projectAssetDirs": [],
"aarAssetDirs": []
}""")
}
}

tasks.withType(Test).configureEach {
dependsOn(generateTestConfig)
systemProperty(
"paparazzi.test.resources",
generateTestConfig.map { it.outputs.files.singleFile }.get().path
)
systemProperty(
"paparazzi.project.dir",
project.layout.projectDirectory.toString()
)
systemProperty(
"paparazzi.build.dir",
project.layout.buildDirectory.get().toString()
)
systemProperty(
"paparazzi.report.dir",
project.extensions.getByType(ReportingExtension).baseDirectory.dir("paparazzi").get().toString()
)
systemProperty(
"paparazzi.snapshot.dir",
project.layout.projectDirectory.dir("src/test/snapshots").toString()
)
systemProperty(
"paparazzi.artifacts.cache.dir",
project.gradle.gradleUserHomeDir.path
)
systemProperty(
"paparazzi.layoutlib.runtime.root",
configurations.layoutlibRuntime.singleFile.absolutePath
)
systemProperty(
"paparazzi.layoutlib.resources.root",
configurations.layoutlibResources.singleFile.absolutePath
)
}
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

a bit unfortunate that both the sdk and junit rule needs this; but it makes sense, the actual config in practice would come from the (gradle) plugin. might make sense to evolve the sdk into a builder pattern; i'll mess around with this in a follow-up.

Copy link
Contributor

@TWiStErRob TWiStErRob Jun 19, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Did you intentionally keep the ...:paparazzi Maven coordinate here?

Consider publishing the -junit4 from the -junit4 module and reintroduce a :paparazzi module that apis both the sdk and the junit4.

File renamed without changes.
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
@file:Suppress("invisible_reference", "invisible_member")
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Consider using all uppercase to highlight that you're suppressing compiler errors

See https://github.com/JetBrains/kotlin/blob/master/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java

Suggested change
@file:Suppress("invisible_reference", "invisible_member")
@file:Suppress("INVISIBLE_REFERENCE", "INVISIBLE_MEMBER")


package app.cash.paparazzi

import android.content.Context
Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
@file:Suppress("invisible_reference", "invisible_member")
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

allows "friend references", i.e., extending internal access across cross project-modules. By default, kotlin only allows code within the same module to access internal members.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.


package app.cash.paparazzi.accessibility

import android.content.Context
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -100,51 +100,6 @@ public final class app/cash/paparazzi/HtmlReportWriter : app/cash/paparazzi/Snap
public fun newFrameHandler (Lapp/cash/paparazzi/Snapshot;II)Lapp/cash/paparazzi/SnapshotHandler$FrameHandler;
}

public final class app/cash/paparazzi/InstantAnimationsRule : org/junit/rules/TestRule {
public static final field $stable I
public fun <init> ()V
public fun apply (Lorg/junit/runners/model/Statement;Lorg/junit/runner/Description;)Lorg/junit/runners/model/Statement;
}

public final class app/cash/paparazzi/Paparazzi : org/junit/rules/TestRule {
public static final field $stable I
public fun <init> ()V
public fun <init> (Lapp/cash/paparazzi/Environment;)V
public fun <init> (Lapp/cash/paparazzi/Environment;Lapp/cash/paparazzi/DeviceConfig;)V
public fun <init> (Lapp/cash/paparazzi/Environment;Lapp/cash/paparazzi/DeviceConfig;Ljava/lang/String;)V
public fun <init> (Lapp/cash/paparazzi/Environment;Lapp/cash/paparazzi/DeviceConfig;Ljava/lang/String;Lcom/android/ide/common/rendering/api/SessionParams$RenderingMode;)V
public fun <init> (Lapp/cash/paparazzi/Environment;Lapp/cash/paparazzi/DeviceConfig;Ljava/lang/String;Lcom/android/ide/common/rendering/api/SessionParams$RenderingMode;Z)V
public fun <init> (Lapp/cash/paparazzi/Environment;Lapp/cash/paparazzi/DeviceConfig;Ljava/lang/String;Lcom/android/ide/common/rendering/api/SessionParams$RenderingMode;ZD)V
public fun <init> (Lapp/cash/paparazzi/Environment;Lapp/cash/paparazzi/DeviceConfig;Ljava/lang/String;Lcom/android/ide/common/rendering/api/SessionParams$RenderingMode;ZDLapp/cash/paparazzi/SnapshotHandler;)V
public fun <init> (Lapp/cash/paparazzi/Environment;Lapp/cash/paparazzi/DeviceConfig;Ljava/lang/String;Lcom/android/ide/common/rendering/api/SessionParams$RenderingMode;ZDLapp/cash/paparazzi/SnapshotHandler;Ljava/util/Set;)V
public fun <init> (Lapp/cash/paparazzi/Environment;Lapp/cash/paparazzi/DeviceConfig;Ljava/lang/String;Lcom/android/ide/common/rendering/api/SessionParams$RenderingMode;ZDLapp/cash/paparazzi/SnapshotHandler;Ljava/util/Set;Z)V
public fun <init> (Lapp/cash/paparazzi/Environment;Lapp/cash/paparazzi/DeviceConfig;Ljava/lang/String;Lcom/android/ide/common/rendering/api/SessionParams$RenderingMode;ZDLapp/cash/paparazzi/SnapshotHandler;Ljava/util/Set;ZZ)V
public fun <init> (Lapp/cash/paparazzi/Environment;Lapp/cash/paparazzi/DeviceConfig;Ljava/lang/String;Lcom/android/ide/common/rendering/api/SessionParams$RenderingMode;ZDLapp/cash/paparazzi/SnapshotHandler;Ljava/util/Set;ZZZ)V
public fun <init> (Lapp/cash/paparazzi/Environment;Lapp/cash/paparazzi/DeviceConfig;Ljava/lang/String;Lcom/android/ide/common/rendering/api/SessionParams$RenderingMode;ZDLapp/cash/paparazzi/SnapshotHandler;Ljava/util/Set;ZZZZ)V
public synthetic fun <init> (Lapp/cash/paparazzi/Environment;Lapp/cash/paparazzi/DeviceConfig;Ljava/lang/String;Lcom/android/ide/common/rendering/api/SessionParams$RenderingMode;ZDLapp/cash/paparazzi/SnapshotHandler;Ljava/util/Set;ZZZZILkotlin/jvm/internal/DefaultConstructorMarker;)V
public fun apply (Lorg/junit/runners/model/Statement;Lorg/junit/runner/Description;)Lorg/junit/runners/model/Statement;
public final fun close ()V
public final fun getContext ()Landroid/content/Context;
public final fun getLayoutInflater ()Landroid/view/LayoutInflater;
public final fun getResources ()Landroid/content/res/Resources;
public final fun gif (Landroid/view/View;)V
public final fun gif (Landroid/view/View;Ljava/lang/String;)V
public final fun gif (Landroid/view/View;Ljava/lang/String;J)V
public final fun gif (Landroid/view/View;Ljava/lang/String;JJ)V
public final fun gif (Landroid/view/View;Ljava/lang/String;JJI)V
public static synthetic fun gif$default (Lapp/cash/paparazzi/Paparazzi;Landroid/view/View;Ljava/lang/String;JJIILjava/lang/Object;)V
public final fun inflate (I)Landroid/view/View;
public final fun prepare (Lorg/junit/runner/Description;)V
public final fun snapshot (Landroid/view/View;)V
public final fun snapshot (Landroid/view/View;Ljava/lang/String;)V
public final fun snapshot (Landroid/view/View;Ljava/lang/String;J)V
public final fun snapshot (Ljava/lang/String;Lkotlin/jvm/functions/Function2;)V
public static synthetic fun snapshot$default (Lapp/cash/paparazzi/Paparazzi;Landroid/view/View;Ljava/lang/String;JILjava/lang/Object;)V
public static synthetic fun snapshot$default (Lapp/cash/paparazzi/Paparazzi;Ljava/lang/String;Lkotlin/jvm/functions/Function2;ILjava/lang/Object;)V
public final fun unsafeUpdateConfig (Lapp/cash/paparazzi/DeviceConfig;Ljava/lang/String;Lcom/android/ide/common/rendering/api/SessionParams$RenderingMode;)V
public static synthetic fun unsafeUpdateConfig$default (Lapp/cash/paparazzi/Paparazzi;Lapp/cash/paparazzi/DeviceConfig;Ljava/lang/String;Lcom/android/ide/common/rendering/api/SessionParams$RenderingMode;ILjava/lang/Object;)V
}

public final class app/cash/paparazzi/PaparazziSdk {
public static final field $stable I
public fun <init> (Lapp/cash/paparazzi/Environment;Lapp/cash/paparazzi/DeviceConfig;Ljava/lang/String;Lcom/android/ide/common/rendering/api/SessionParams$RenderingMode;Lkotlin/jvm/functions/Function1;)V
Expand Down
1 change: 0 additions & 1 deletion paparazzi/build.gradle → paparazzi-sdk/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,6 @@ dependencies {
api libs.tools.ninepatch
api libs.tools.sdkCommon
api libs.kxml2
api libs.junit
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎉

api libs.androidx.annotations
api libs.guava
api libs.kotlinx.coroutines.android
Expand Down
4 changes: 4 additions & 0 deletions paparazzi-sdk/gradle.properties
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
POM_ARTIFACT_ID=paparazzi-sdk
POM_NAME=Paparazzi SDK
POM_DESCRIPTION=An SDK to render your application screens without a physical device or emulator
POM_PACKAGING=jar
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
*/
package app.cash.paparazzi.internal

import app.cash.paparazzi.Paparazzi
import app.cash.paparazzi.PaparazziSdk
import com.android.ide.common.rendering.api.ILayoutLog
import com.android.utils.ILogger
import java.io.PrintStream
Expand All @@ -28,7 +28,7 @@ import java.util.logging.Logger.getLogger
* This logger delegates to java.util.Logging.
*/
internal class PaparazziLogger : ILayoutLog, ILogger {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

rename class to match module/logger?

private val logger: Logger = getLogger(Paparazzi::class.java.name)
private val logger: Logger = getLogger(PaparazziSdk::class.java.name)
private val errors = mutableListOf<Throwable>()

override fun error(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ package app.cash.paparazzi.internal
import app.cash.paparazzi.DeviceConfig
import app.cash.paparazzi.Environment
import app.cash.paparazzi.Flags
import app.cash.paparazzi.Paparazzi
import app.cash.paparazzi.PaparazziSdk
import app.cash.paparazzi.getFieldReflectively
import app.cash.paparazzi.internal.resources.AarSourceResourceRepository
import app.cash.paparazzi.internal.resources.AppResourceRepository
Expand Down Expand Up @@ -119,7 +119,7 @@ internal class Renderer(
}

private fun configureBuildProperties() {
val classLoader = Paparazzi::class.java.classLoader
val classLoader = PaparazziSdk::class.java.classLoader
val buildClass = try {
classLoader.loadClass("android.os.Build")
} catch (e: ClassNotFoundException) {
Expand Down
3 changes: 2 additions & 1 deletion settings.gradle
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
rootProject.name = 'paparazzi-root'

include ':paparazzi'
include ':paparazzi-sdk'
include ':paparazzi-junit4'
include ':paparazzi-annotations'
include ':paparazzi-preview-processor'
include ':paparazzi-gradle-plugin'
Expand Down