diff --git a/.gitignore b/.gitignore index 3eff0da141a..48c1d048f7e 100644 --- a/.gitignore +++ b/.gitignore @@ -12,3 +12,4 @@ sqldelight-gradle-plugin/src/test/integration/gradle sqldelight-gradle-plugin/src/test/integration-android/gradle sqldelight-gradle-plugin/src/test/integration-android-library/gradle sqldelight-gradle-plugin/src/test/integration-multiplatform/gradle +sqldelight-gradle-plugin/src/test/multi-module/gradle diff --git a/sqldelight-gradle-plugin/src/main/kotlin/com/squareup/sqldelight/gradle/SqlDelightDatabase.kt b/sqldelight-gradle-plugin/src/main/kotlin/com/squareup/sqldelight/gradle/SqlDelightDatabase.kt index 15a01d9e11a..3dae0605e81 100644 --- a/sqldelight-gradle-plugin/src/main/kotlin/com/squareup/sqldelight/gradle/SqlDelightDatabase.kt +++ b/sqldelight-gradle-plugin/src/main/kotlin/com/squareup/sqldelight/gradle/SqlDelightDatabase.kt @@ -24,25 +24,66 @@ class SqlDelightDatabase( get() = File(project.buildDir, "sqldelight/$name") private val sources by lazy { sources() } + private val dependencies = mutableListOf() + + private var recursionGuard = false fun methodMissing(name: String, args: Any): Any { return (project as GroovyObject).invokeMethod(name, args) } + fun dependency(dependencyProject: Project) { + dependencyProject.afterEvaluate { + val dependency = dependencyProject.extensions.findByType(SqlDelightExtension::class.java) + ?: throw IllegalStateException("Cannot depend on a module with no sqldelight plugin.") + dependencies.add(dependency.databases.singleOrNull { it.name == name } + ?: throw IllegalStateException("No database named $name in $dependencyProject")) + } + } + internal fun getProperties(): SqlDelightDatabaseProperties { val packageName = requireNotNull(packageName) { "property packageName must be provided" } - return SqlDelightDatabaseProperties( - packageName = packageName, - compilationUnits = sources.map { source -> - return@map SqlDelightCompilationUnit( - name = source.name, - sourceFolders = relativeSourceFolders(source) - ) - }, - outputDirectory = outputDirectory.toRelativeString(project.projectDir), - className = name - ) + if (recursionGuard) { + throw IllegalStateException("Found a circular dependency in $project with database $name") + } + recursionGuard = true + + try { + return SqlDelightDatabaseProperties( + packageName = packageName, + compilationUnits = sources.map { source -> + return@map SqlDelightCompilationUnit( + name = source.name, + sourceFolders = sourceFolders(source) + ) + }, + outputDirectory = outputDirectory.toRelativeString(project.projectDir), + className = name + ) + } finally { + recursionGuard = false + } + } + + private fun sourceFolders(source: Source): List { + val sourceFolders = sourceFolders ?: listOf("sqldelight") + + val relativeSourceFolders = sourceFolders.flatMap { folder -> + source.sourceSets.map { "src/$it/$folder" } + } + + return relativeSourceFolders + dependencies.flatMap { dependency -> + val dependencySource = source.closestMatch(dependency.sources) + ?: return@flatMap emptyList() + val compilationUnit = dependency.getProperties().compilationUnits + .single { it.name == dependencySource.name } + + return@flatMap compilationUnit.sourceFolders.map { + val folder = File(dependency.project.projectDir, it) + return@map project.relativePath(folder) + } + } } internal fun registerTasks() { @@ -67,7 +108,7 @@ class SqlDelightDatabase( // Add the source dependency on the generated code. source.sourceDirectorySet.srcDir(outputDirectory.toRelativeString(project.projectDir)) - val sourceFiles = project.files(*relativeSourceFolders(source).map(::File).toTypedArray()) + val sourceFiles = project.files(*sourceFolders(source).map(::File).toTypedArray()) // Register the sqldelight generating task. val task = project.tasks.register("generate${source.name.capitalize()}${name}Interface", SqlDelightTask::class.java) { @@ -89,14 +130,6 @@ class SqlDelightDatabase( } } - private fun relativeSourceFolders(source: Source): List { - val sourceFolders = sourceFolders ?: listOf("sqldelight") - - return sourceFolders.flatMap { folder -> - source.sourceSets.map { "src/$it/$folder" } - } - } - private fun addMigrationTasks( sourceSet: Collection, source: Source diff --git a/sqldelight-gradle-plugin/src/main/kotlin/com/squareup/sqldelight/gradle/kotlin/SourceRoots.kt b/sqldelight-gradle-plugin/src/main/kotlin/com/squareup/sqldelight/gradle/kotlin/SourceRoots.kt index 263bda57ad6..339a11c4196 100644 --- a/sqldelight-gradle-plugin/src/main/kotlin/com/squareup/sqldelight/gradle/kotlin/SourceRoots.kt +++ b/sqldelight-gradle-plugin/src/main/kotlin/com/squareup/sqldelight/gradle/kotlin/SourceRoots.kt @@ -13,7 +13,11 @@ import org.gradle.api.file.SourceDirectorySet import org.gradle.api.tasks.SourceSetContainer import org.gradle.api.tasks.TaskProvider import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension +import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType +import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJvmAndroidCompilation import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinMetadataTargetPreset +import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget +import org.jetbrains.kotlin.konan.target.KonanTarget /** * @return A list of source roots and their dependencies. @@ -44,6 +48,7 @@ internal fun SqlDelightDatabase.sources(): List { // Kotlin project. val sourceSets = project.property("sourceSets") as SourceSetContainer return listOf(Source( + type = KotlinPlatformType.jvm, name = "main", sourceSets = listOf("main"), sourceDirectorySet = sourceSets.getByName("main").kotlin!!, @@ -72,7 +77,10 @@ private fun KotlinMultiplatformExtension.sources(): List { return@mapNotNull null } Source( + type = target.platformType, + konanTarget = (target as? KotlinNativeTarget)?.konanTarget, name = "${target.name}${compilation.name.capitalize()}", + variantName = (compilation as? KotlinJvmAndroidCompilation)?.name, sourceDirectorySet = compilation.defaultSourceSet.kotlin, sourceSets = compilation.allKotlinSourceSets.map { it.name }, registerTaskDependency = { task -> @@ -96,7 +104,9 @@ private fun BaseExtension.sources(project: Project): List { return variants.map { variant -> Source( + type = KotlinPlatformType.androidJvm, name = variant.name, + variantName = variant.name, sourceDirectorySet = sourceSets[variant.name] ?: throw IllegalStateException("Couldnt find ${variant.name} in $sourceSets"), sourceSets = variant.sourceSets.map { it.name }, @@ -107,8 +117,24 @@ private fun BaseExtension.sources(project: Project): List { } } internal data class Source( + val type: KotlinPlatformType, + val konanTarget: KonanTarget? = null, val sourceDirectorySet: SourceDirectorySet, val name: String, + val variantName: String? = null, val sourceSets: List, val registerTaskDependency: (TaskProvider) -> Unit -) \ No newline at end of file +) { + fun closestMatch(sources: Collection): Source? { + var matches = sources.filter { + type == it.type || (type == KotlinPlatformType.androidJvm && it.type == KotlinPlatformType.jvm ) + } + if (matches.size <= 1) return matches.singleOrNull() + + // Multiplatform native matched or android variants matched. + matches = matches.filter { + konanTarget == it.konanTarget && variantName == it.variantName + } + return matches.singleOrNull() + } +} \ No newline at end of file diff --git a/sqldelight-gradle-plugin/src/test/integration/build.gradle b/sqldelight-gradle-plugin/src/test/integration/build.gradle index b1021906546..c020cf0e53c 100644 --- a/sqldelight-gradle-plugin/src/test/integration/build.gradle +++ b/sqldelight-gradle-plugin/src/test/integration/build.gradle @@ -22,6 +22,5 @@ dependencies { implementation deps.kotlin.stdlib.jdk implementation deps.sqliteJdbc implementation "com.squareup.sqldelight:sqlite-driver:${com.squareup.sqldelight.VersionKt.VERSION}" - // TODO why don't these work when specified as androidTestImplementation? - compile deps.truth + implementation deps.truth } diff --git a/sqldelight-gradle-plugin/src/test/kotlin/com/squareup/sqldelight/MultiModuleTests.kt b/sqldelight-gradle-plugin/src/test/kotlin/com/squareup/sqldelight/MultiModuleTests.kt new file mode 100644 index 00000000000..f77f6800efe --- /dev/null +++ b/sqldelight-gradle-plugin/src/test/kotlin/com/squareup/sqldelight/MultiModuleTests.kt @@ -0,0 +1,275 @@ +package com.squareup.sqldelight + +import com.google.common.truth.Truth.assertThat +import com.squareup.sqldelight.core.SqlDelightCompilationUnit +import com.squareup.sqldelight.core.SqlDelightPropertiesFile +import org.gradle.testkit.runner.GradleRunner +import org.junit.Test +import java.io.File + +class MultiModuleTests { + @Test + fun `sqldelight dependencies are added to the compilation unit`() { + val androidHome = androidHome() + val fixtureRoot = File("src/test/multi-module") + File(fixtureRoot, ".idea").mkdir() + File(fixtureRoot, "local.properties").writeText("sdk.dir=$androidHome\n") + + GradleRunner.create() + .withProjectDir(fixtureRoot) + .withPluginClasspath() + .withArguments("clean", "--stacktrace") + .build() + + // verify + val propertiesFile = File(fixtureRoot, ".idea/sqldelight/ProjectA/${SqlDelightPropertiesFile.NAME}") + assertThat(propertiesFile.exists()).isTrue() + + val properties = SqlDelightPropertiesFile.fromFile(propertiesFile).databases.single() + assertThat(properties.packageName).isEqualTo("com.example") + assertThat(properties.outputDirectory).isEqualTo("build/sqldelight/Database") + assertThat(properties.compilationUnits).hasSize(1) + + with(properties.compilationUnits[0]) { + assertThat(sourceFolders).containsExactly("src/main/sqldelight", "../ProjectB/src/main/sqldelight") + } + + propertiesFile.delete() + } + + @Test + fun integrationTests() { + val androidHome = androidHome() + val integrationRoot = File("src/test/multi-module") + File(integrationRoot, "local.properties").writeText("sdk.dir=$androidHome\n") + + val gradleRoot = File(integrationRoot, "gradle").apply { + mkdir() + } + File("../gradle/wrapper").copyRecursively(File(gradleRoot, "wrapper"), true) + + val runner = GradleRunner.create() + .withProjectDir(integrationRoot) + .withPluginClasspath() + .withArguments("clean", ":ProjectA:check", "--stacktrace") + + val result = runner.build() + assertThat(result.output).contains("BUILD SUCCESSFUL") + } + @Test + fun `the android target of a multiplatform module is a dependency for an android only module`() { + val androidHome = androidHome() + val fixtureRoot = File("src/test/multi-module") + File(fixtureRoot, ".idea").mkdir() + File(fixtureRoot, "local.properties").writeText("sdk.dir=$androidHome\n") + + GradleRunner.create() + .withProjectDir(fixtureRoot) + .withPluginClasspath() + .withArguments("clean", "--stacktrace") + .build() + + // verify + val propertiesFile = File(fixtureRoot, ".idea/sqldelight/AndroidProject/${SqlDelightPropertiesFile.NAME}") + assertThat(propertiesFile.exists()).isTrue() + + val properties = SqlDelightPropertiesFile.fromFile(propertiesFile).databases.single() + assertThat(properties.packageName).isEqualTo("com.sample") + assertThat(properties.outputDirectory).isEqualTo("build/sqldelight/CommonDb") + assertThat(properties.compilationUnits).containsExactly( + SqlDelightCompilationUnit( + name = "minApi23DemoDebug", + sourceFolders = listOf( + "src/main/sqldelight", + "src/demo/sqldelight", + "src/minApi23/sqldelight", + "src/minApi23Demo/sqldelight", + "src/debug/sqldelight", + "src/minApi23DemoDebug/sqldelight", + "../MultiplatformProject/src/androidLibMinApi23DemoDebug/sqldelight", + "../MultiplatformProject/src/androidLibMain/sqldelight", + "../MultiplatformProject/src/androidLibDemo/sqldelight", + "../MultiplatformProject/src/androidLibMinApi23/sqldelight", + "../MultiplatformProject/src/androidLibMinApi23Demo/sqldelight", + "../MultiplatformProject/src/androidLibDebug/sqldelight", + "../MultiplatformProject/src/commonMain/sqldelight")), + SqlDelightCompilationUnit( + name = "minApi23DemoRelease", + sourceFolders = listOf( + "src/main/sqldelight", + "src/demo/sqldelight", + "src/minApi23/sqldelight", + "src/minApi23Demo/sqldelight", + "src/release/sqldelight", + "src/minApi23DemoRelease/sqldelight", + "../MultiplatformProject/src/androidLibMinApi23DemoRelease/sqldelight", + "../MultiplatformProject/src/androidLibMain/sqldelight", + "../MultiplatformProject/src/androidLibDemo/sqldelight", + "../MultiplatformProject/src/androidLibMinApi23/sqldelight", + "../MultiplatformProject/src/androidLibMinApi23Demo/sqldelight", + "../MultiplatformProject/src/androidLibRelease/sqldelight", + "../MultiplatformProject/src/commonMain/sqldelight")), + SqlDelightCompilationUnit( + name = "minApi23DemoSqldelight", + sourceFolders = listOf( + "src/main/sqldelight", + "src/demo/sqldelight", + "src/minApi23/sqldelight", + "src/minApi23Demo/sqldelight", + "src/sqldelight/sqldelight", + "src/minApi23DemoSqldelight/sqldelight", + "../MultiplatformProject/src/androidLibMinApi23DemoSqldelight/sqldelight", + "../MultiplatformProject/src/androidLibMain/sqldelight", + "../MultiplatformProject/src/androidLibDemo/sqldelight", + "../MultiplatformProject/src/androidLibMinApi23/sqldelight", + "../MultiplatformProject/src/androidLibMinApi23Demo/sqldelight", + "../MultiplatformProject/src/androidLibSqldelight/sqldelight", + "../MultiplatformProject/src/commonMain/sqldelight")), + SqlDelightCompilationUnit( + name = "minApi23FullDebug", + sourceFolders = listOf( + "src/main/sqldelight", + "src/full/sqldelight", + "src/minApi23/sqldelight", + "src/minApi23Full/sqldelight", + "src/debug/sqldelight", + "src/minApi23FullDebug/sqldelight", + "../MultiplatformProject/src/androidLibMinApi23FullDebug/sqldelight", + "../MultiplatformProject/src/androidLibMain/sqldelight", + "../MultiplatformProject/src/androidLibFull/sqldelight", + "../MultiplatformProject/src/androidLibMinApi23/sqldelight", + "../MultiplatformProject/src/androidLibMinApi23Full/sqldelight", + "../MultiplatformProject/src/androidLibDebug/sqldelight", + "../MultiplatformProject/src/commonMain/sqldelight")), + SqlDelightCompilationUnit( + name = "minApi23FullRelease", + sourceFolders = listOf( + "src/main/sqldelight", + "src/full/sqldelight", + "src/minApi23/sqldelight", + "src/minApi23Full/sqldelight", + "src/release/sqldelight", + "src/minApi23FullRelease/sqldelight", + "../MultiplatformProject/src/androidLibMinApi23FullRelease/sqldelight", + "../MultiplatformProject/src/androidLibMain/sqldelight", + "../MultiplatformProject/src/androidLibFull/sqldelight", + "../MultiplatformProject/src/androidLibMinApi23/sqldelight", + "../MultiplatformProject/src/androidLibMinApi23Full/sqldelight", + "../MultiplatformProject/src/androidLibRelease/sqldelight", + "../MultiplatformProject/src/commonMain/sqldelight")), + SqlDelightCompilationUnit( + name = "minApi23FullSqldelight", + sourceFolders = listOf( + "src/main/sqldelight", + "src/full/sqldelight", + "src/minApi23/sqldelight", + "src/minApi23Full/sqldelight", + "src/sqldelight/sqldelight", + "src/minApi23FullSqldelight/sqldelight", + "../MultiplatformProject/src/androidLibMinApi23FullSqldelight/sqldelight", + "../MultiplatformProject/src/androidLibMain/sqldelight", + "../MultiplatformProject/src/androidLibFull/sqldelight", + "../MultiplatformProject/src/androidLibMinApi23/sqldelight", + "../MultiplatformProject/src/androidLibMinApi23Full/sqldelight", + "../MultiplatformProject/src/androidLibSqldelight/sqldelight", + "../MultiplatformProject/src/commonMain/sqldelight")), + SqlDelightCompilationUnit( + name = "minApi21DemoDebug", + sourceFolders = listOf( + "src/main/sqldelight", + "src/demo/sqldelight", + "src/minApi21/sqldelight", + "src/minApi21Demo/sqldelight", + "src/debug/sqldelight", + "src/minApi21DemoDebug/sqldelight", + "../MultiplatformProject/src/androidLibMinApi21DemoDebug/sqldelight", + "../MultiplatformProject/src/androidLibMain/sqldelight", + "../MultiplatformProject/src/androidLibDemo/sqldelight", + "../MultiplatformProject/src/androidLibMinApi21/sqldelight", + "../MultiplatformProject/src/androidLibMinApi21Demo/sqldelight", + "../MultiplatformProject/src/androidLibDebug/sqldelight", + "../MultiplatformProject/src/commonMain/sqldelight")), + SqlDelightCompilationUnit( + name = "minApi21DemoRelease", + sourceFolders = listOf( + "src/main/sqldelight", + "src/demo/sqldelight", + "src/minApi21/sqldelight", + "src/minApi21Demo/sqldelight", + "src/release/sqldelight", + "src/minApi21DemoRelease/sqldelight", + "../MultiplatformProject/src/androidLibMinApi21DemoRelease/sqldelight", + "../MultiplatformProject/src/androidLibMain/sqldelight", + "../MultiplatformProject/src/androidLibDemo/sqldelight", + "../MultiplatformProject/src/androidLibMinApi21/sqldelight", + "../MultiplatformProject/src/androidLibMinApi21Demo/sqldelight", + "../MultiplatformProject/src/androidLibRelease/sqldelight", + "../MultiplatformProject/src/commonMain/sqldelight")), + SqlDelightCompilationUnit( + name = "minApi21DemoSqldelight", + sourceFolders = listOf("src/main/sqldelight", + "src/demo/sqldelight", + "src/minApi21/sqldelight", + "src/minApi21Demo/sqldelight", + "src/sqldelight/sqldelight", + "src/minApi21DemoSqldelight/sqldelight", + "../MultiplatformProject/src/androidLibMinApi21DemoSqldelight/sqldelight", + "../MultiplatformProject/src/androidLibMain/sqldelight", + "../MultiplatformProject/src/androidLibDemo/sqldelight", + "../MultiplatformProject/src/androidLibMinApi21/sqldelight", + "../MultiplatformProject/src/androidLibMinApi21Demo/sqldelight", + "../MultiplatformProject/src/androidLibSqldelight/sqldelight", + "../MultiplatformProject/src/commonMain/sqldelight")), + SqlDelightCompilationUnit( + name = "minApi21FullDebug", + sourceFolders = listOf( + "src/main/sqldelight", + "src/full/sqldelight", + "src/minApi21/sqldelight", + "src/minApi21Full/sqldelight", + "src/debug/sqldelight", + "src/minApi21FullDebug/sqldelight", + "../MultiplatformProject/src/androidLibMinApi21FullDebug/sqldelight", + "../MultiplatformProject/src/androidLibMain/sqldelight", + "../MultiplatformProject/src/androidLibFull/sqldelight", + "../MultiplatformProject/src/androidLibMinApi21/sqldelight", + "../MultiplatformProject/src/androidLibMinApi21Full/sqldelight", + "../MultiplatformProject/src/androidLibDebug/sqldelight", + "../MultiplatformProject/src/commonMain/sqldelight")), + SqlDelightCompilationUnit( + name = "minApi21FullRelease", + sourceFolders = listOf( + "src/main/sqldelight", + "src/full/sqldelight", + "src/minApi21/sqldelight", + "src/minApi21Full/sqldelight", + "src/release/sqldelight", + "src/minApi21FullRelease/sqldelight", + "../MultiplatformProject/src/androidLibMinApi21FullRelease/sqldelight", + "../MultiplatformProject/src/androidLibMain/sqldelight", + "../MultiplatformProject/src/androidLibFull/sqldelight", + "../MultiplatformProject/src/androidLibMinApi21/sqldelight", + "../MultiplatformProject/src/androidLibMinApi21Full/sqldelight", + "../MultiplatformProject/src/androidLibRelease/sqldelight", + "../MultiplatformProject/src/commonMain/sqldelight")), + SqlDelightCompilationUnit( + name = "minApi21FullSqldelight", + sourceFolders = listOf( + "src/main/sqldelight", + "src/full/sqldelight", + "src/minApi21/sqldelight", + "src/minApi21Full/sqldelight", + "src/sqldelight/sqldelight", + "src/minApi21FullSqldelight/sqldelight", + "../MultiplatformProject/src/androidLibMinApi21FullSqldelight/sqldelight", + "../MultiplatformProject/src/androidLibMain/sqldelight", + "../MultiplatformProject/src/androidLibFull/sqldelight", + "../MultiplatformProject/src/androidLibMinApi21/sqldelight", + "../MultiplatformProject/src/androidLibMinApi21Full/sqldelight", + "../MultiplatformProject/src/androidLibSqldelight/sqldelight", + "../MultiplatformProject/src/commonMain/sqldelight")) + ) + + propertiesFile.delete() + } +} \ No newline at end of file diff --git a/sqldelight-gradle-plugin/src/test/multi-module/AndroidProject/build.gradle b/sqldelight-gradle-plugin/src/test/multi-module/AndroidProject/build.gradle new file mode 100644 index 00000000000..8878b6e8916 --- /dev/null +++ b/sqldelight-gradle-plugin/src/test/multi-module/AndroidProject/build.gradle @@ -0,0 +1,42 @@ +plugins { + id 'com.android.application' + id 'org.jetbrains.kotlin.android' + id 'com.squareup.sqldelight' +} + +apply from: "${rootDir}/../../../../gradle/dependencies.gradle" + +sqldelight { + CommonDb { + packageName = "com.sample" + dependency project(":MultiplatformProject") + } +} + +android { + compileSdkVersion versions.compileSdk + + buildTypes { + release {} + sqldelight {} + } + + flavorDimensions "api", "mode" + + productFlavors { + demo { + applicationIdSuffix ".demo" + dimension "mode" + } + full { + applicationIdSuffix ".full" + dimension "mode" + } + minApi21 { + dimension "api" + } + minApi23 { + dimension "api" + } + } +} \ No newline at end of file diff --git a/sqldelight-gradle-plugin/src/test/multi-module/AndroidProject/src/main/AndroidManifest.xml b/sqldelight-gradle-plugin/src/test/multi-module/AndroidProject/src/main/AndroidManifest.xml new file mode 100644 index 00000000000..e1d844d98b0 --- /dev/null +++ b/sqldelight-gradle-plugin/src/test/multi-module/AndroidProject/src/main/AndroidManifest.xml @@ -0,0 +1 @@ + diff --git a/sqldelight-gradle-plugin/src/test/multi-module/MultiplatformProject/build.gradle b/sqldelight-gradle-plugin/src/test/multi-module/MultiplatformProject/build.gradle new file mode 100644 index 00000000000..eb184c7bf69 --- /dev/null +++ b/sqldelight-gradle-plugin/src/test/multi-module/MultiplatformProject/build.gradle @@ -0,0 +1,46 @@ +plugins { + id 'org.jetbrains.kotlin.multiplatform' + id 'com.android.application' + id 'com.squareup.sqldelight' +} + +apply from: "${rootDir}/../../../../gradle/dependencies.gradle" + +sqldelight { + CommonDb { + packageName = "com.sample" + } +} + +android { + compileSdkVersion versions.compileSdk + + buildTypes { + release {} + sqldelight {} + } + + flavorDimensions "api", "mode" + + productFlavors { + demo { + applicationIdSuffix ".demo" + dimension "mode" + } + full { + applicationIdSuffix ".full" + dimension "mode" + } + minApi21 { + dimension "api" + } + minApi23 { + dimension "api" + } + } +} + +kotlin { + targetFromPreset(presets.iosX64, 'iosX64') + targetFromPreset(presets.android, 'androidLib') +} \ No newline at end of file diff --git a/sqldelight-gradle-plugin/src/test/multi-module/MultiplatformProject/src/main/AndroidManifest.xml b/sqldelight-gradle-plugin/src/test/multi-module/MultiplatformProject/src/main/AndroidManifest.xml new file mode 100644 index 00000000000..9bb08f740a1 --- /dev/null +++ b/sqldelight-gradle-plugin/src/test/multi-module/MultiplatformProject/src/main/AndroidManifest.xml @@ -0,0 +1 @@ + diff --git a/sqldelight-gradle-plugin/src/test/multi-module/ProjectA/build.gradle b/sqldelight-gradle-plugin/src/test/multi-module/ProjectA/build.gradle new file mode 100644 index 00000000000..35f6e4bc8e4 --- /dev/null +++ b/sqldelight-gradle-plugin/src/test/multi-module/ProjectA/build.gradle @@ -0,0 +1,21 @@ +plugins { + id 'kotlin' + id 'com.squareup.sqldelight' +} + +apply from: "${rootDir.absolutePath}/../../../../gradle/dependencies.gradle" + +sqldelight { + Database { + packageName = "com.example" + schemaOutputDirectory = file('src/main/sqldelight/databases') + dependency project(':ProjectB') + } +} + +dependencies { + implementation project(':ProjectB') + implementation deps.kotlin.stdlib.jdk + implementation "com.squareup.sqldelight:sqlite-driver:${com.squareup.sqldelight.VersionKt.VERSION}" + implementation deps.truth +} diff --git a/sqldelight-gradle-plugin/src/test/multi-module/ProjectA/src/main/sqldelight/com/sample/Other.sq b/sqldelight-gradle-plugin/src/test/multi-module/ProjectA/src/main/sqldelight/com/sample/Other.sq new file mode 100644 index 00000000000..225c2a321f1 --- /dev/null +++ b/sqldelight-gradle-plugin/src/test/multi-module/ProjectA/src/main/sqldelight/com/sample/Other.sq @@ -0,0 +1,3 @@ +selectData: +SELECT value +FROM data; \ No newline at end of file diff --git a/sqldelight-gradle-plugin/src/test/multi-module/ProjectA/src/test/java/com/squareup/sqldelight/integration/IntegrationTests.kt b/sqldelight-gradle-plugin/src/test/multi-module/ProjectA/src/test/java/com/squareup/sqldelight/integration/IntegrationTests.kt new file mode 100644 index 00000000000..7c71e55fcbd --- /dev/null +++ b/sqldelight-gradle-plugin/src/test/multi-module/ProjectA/src/test/java/com/squareup/sqldelight/integration/IntegrationTests.kt @@ -0,0 +1,39 @@ +package com.squareup.sqldelight.integration + +import com.example.Database +import com.squareup.sqldelight.sqlite.driver.JdbcSqliteDriver +import com.squareup.sqldelight.db.SqlDriver +import com.squareup.sqldelight.Query +import org.junit.Before +import org.junit.Test + +import com.google.common.truth.Truth.assertThat + +class IntegrationTests { + private lateinit var database: Database + + @Before fun before() { + val driver = JdbcSqliteDriver() + Database.Schema.create(driver) + + database = Database(driver) + } + + @Test fun insertInSubmodule() { + var timesNotified = 0 + val selectData = database.otherQueries.selectData() + + selectData.addListener(object : Query.Listener { + override fun queryResultsChanged() { + timesNotified++ + } + }) + + assertThat(selectData.executeAsList()).containsExactly("first_value") + + database.dataQueries.insert("second_value") + + assertThat(timesNotified).isEqualTo(1) + assertThat(selectData.executeAsList()).containsExactly("first_value", "second_value").inOrder() + } +} diff --git a/sqldelight-gradle-plugin/src/test/multi-module/ProjectB/build.gradle b/sqldelight-gradle-plugin/src/test/multi-module/ProjectB/build.gradle new file mode 100644 index 00000000000..8592821b575 --- /dev/null +++ b/sqldelight-gradle-plugin/src/test/multi-module/ProjectB/build.gradle @@ -0,0 +1,11 @@ +plugins { + id 'kotlin' + id 'com.squareup.sqldelight' +} + +sqldelight { + Database { + packageName = "com.example" + schemaOutputDirectory = file('src/main/sqldelight/databases') + } +} \ No newline at end of file diff --git a/sqldelight-gradle-plugin/src/test/multi-module/ProjectB/src/main/sqldelight/com/sample/Data.sq b/sqldelight-gradle-plugin/src/test/multi-module/ProjectB/src/main/sqldelight/com/sample/Data.sq new file mode 100644 index 00000000000..42e165bc0f3 --- /dev/null +++ b/sqldelight-gradle-plugin/src/test/multi-module/ProjectB/src/main/sqldelight/com/sample/Data.sq @@ -0,0 +1,11 @@ +CREATE TABLE data ( + id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, + value TEXT NOT NULL +); + +INSERT INTO data (value) +VALUES ('first_value'); + +insert: +INSERT INTO data (value) +VALUES (?); \ No newline at end of file diff --git a/sqldelight-gradle-plugin/src/test/multi-module/build.gradle b/sqldelight-gradle-plugin/src/test/multi-module/build.gradle new file mode 100644 index 00000000000..93871d23f23 --- /dev/null +++ b/sqldelight-gradle-plugin/src/test/multi-module/build.gradle @@ -0,0 +1,9 @@ +allprojects { + repositories { + maven { + url "file://${rootDir.absolutePath}/../../../../build/localMaven" + } + mavenCentral() + google() + } +} \ No newline at end of file diff --git a/sqldelight-gradle-plugin/src/test/multi-module/settings.gradle b/sqldelight-gradle-plugin/src/test/multi-module/settings.gradle new file mode 100644 index 00000000000..9217f764d8d --- /dev/null +++ b/sqldelight-gradle-plugin/src/test/multi-module/settings.gradle @@ -0,0 +1,4 @@ +include ':AndroidProject' +include ':MultiplatformProject' +include ':ProjectA' +include ':ProjectB'