Skip to content

Commit

Permalink
Revert "Gradle tweaks (#4222)" (#4282)
Browse files Browse the repository at this point in the history
This reverts commit 9012c42.
  • Loading branch information
Alec Kazakova committed Jun 15, 2023
1 parent 497a370 commit 4d2e8ff
Show file tree
Hide file tree
Showing 8 changed files with 132 additions and 63 deletions.
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package app.cash.sqldelight.gradle

import app.cash.sqldelight.VERSION
import app.cash.sqldelight.core.SqlDelightCompilationUnit
import app.cash.sqldelight.core.SqlDelightDatabaseProperties
import app.cash.sqldelight.core.SqlDelightEnvironment
Expand All @@ -25,16 +26,21 @@ import java.util.ServiceLoader

@CacheableTask
abstract class GenerateMigrationOutputTask : SqlDelightWorkerTask() {
@Suppress("unused")
// Required to invalidate the task on version updates.
@Input
val pluginVersion = VERSION

@get:OutputDirectory
abstract val outputDirectory: DirectoryProperty
var outputDirectory: File? = null

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

@get:Nested abstract var properties: SqlDelightDatabasePropertiesImpl

@get:Nested abstract var compilationUnit: SqlDelightCompilationUnitImpl

@get:Input abstract val migrationOutputExtension: Property<String>
@get:Input abstract var migrationOutputExtension: String

@TaskAction
fun generateSchemaFile() {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package app.cash.sqldelight.gradle

import app.cash.sqldelight.VERSION
import app.cash.sqldelight.core.SqlDelightCompilationUnit
import app.cash.sqldelight.core.SqlDelightDatabaseProperties
import app.cash.sqldelight.core.SqlDelightEnvironment
Expand Down Expand Up @@ -29,16 +30,21 @@ import java.util.ServiceLoader

@CacheableTask
abstract class GenerateSchemaTask : SqlDelightWorkerTask() {
@Suppress("unused")
// Required to invalidate the task on version updates.
@Input
val pluginVersion = VERSION

@get:OutputDirectory
abstract val outputDirectory: DirectoryProperty
var outputDirectory: File? = null

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

@get:Nested abstract var properties: SqlDelightDatabasePropertiesImpl

@get:Nested abstract var compilationUnit: SqlDelightCompilationUnitImpl

@get:Input abstract val verifyMigrations: Property<Boolean>
@Input var verifyMigrations: Boolean = false

@TaskAction
fun generateSchemaFile() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,6 @@ abstract class SqlDelightDatabase @Inject constructor(
abstract val srcDirs: ConfigurableFileCollection
val deriveSchemaFromMigrations: Property<Boolean> = project.objects.property(Boolean::class.java).convention(false)
val verifyMigrations: Property<Boolean> = project.objects.property(Boolean::class.java).convention(false)
val verifyDefinitions: Property<Boolean> = project.objects.property(Boolean::class.java).convention(true)
abstract val migrationOutputDirectory: DirectoryProperty
val migrationOutputFileFormat: Property<String> = project.objects.property(String::class.java).convention(".sql")
val generateAsync: Property<Boolean> = project.objects.property(Boolean::class.java).convention(false)
Expand Down Expand Up @@ -136,7 +135,7 @@ abstract class SqlDelightDatabase @Inject constructor(
}

internal fun getProperties(): SqlDelightDatabasePropertiesImpl {
require(packageName.isPresent) { "property packageName for $name database must be provided" }
val packageName = requireNotNull(packageName.getOrNull()) { "property packageName for $name database must be provided" }

check(!recursionGuard) { "Found a circular dependency in $project with database $name" }
recursionGuard = true
Expand All @@ -157,7 +156,7 @@ abstract class SqlDelightDatabase @Inject constructor(

try {
return SqlDelightDatabasePropertiesImpl(
packageName = packageName.get(),
packageName = packageName,
compilationUnits = sources.map { source ->
SqlDelightCompilationUnitImpl(
name = source.name,
Expand Down Expand Up @@ -220,17 +219,17 @@ abstract class SqlDelightDatabase @Inject constructor(
it.projectName.set(project.name)
it.properties = getProperties()
it.compilationUnit = getProperties().compilationUnits.single { it.name == source.name }
it.outputDirectory.set(source.outputDir)
it.outputDirectory = source.outputDir
it.source(sourceFiles)
it.include("**${File.separatorChar}*.$SQLDELIGHT_EXTENSION")
it.include("**${File.separatorChar}*.$MIGRATION_EXTENSION")
it.group = SqlDelightPlugin.GROUP
it.description = "Generate ${source.name} Kotlin interface for $name"
it.verifyMigrations.set(verifyMigrations)
it.verifyMigrations = verifyMigrations.get()
it.classpath.setFrom(intellijEnv, migrationEnv, configuration)
}

val outputDirectoryProvider: Provider<File> = task.flatMap { it.outputDirectory.asFile }
val outputDirectoryProvider: Provider<File> = task.map { it.outputDirectory!! }

// Add the source dependency on the generated code.
// Use a Provider generated from the task to carry task dependencies
Expand All @@ -251,7 +250,7 @@ abstract class SqlDelightDatabase @Inject constructor(
addSquashTask(sourceFiles, source)
}

if (migrationOutputDirectory.isPresent) {
if (migrationOutputDirectory.getOrNull() != null) {
addMigrationOutputTasks(sourceFiles, source)
}
}
Expand All @@ -268,27 +267,26 @@ abstract class SqlDelightDatabase @Inject constructor(
it.source(sourceSet)
it.include("**${File.separatorChar}*.$SQLDELIGHT_EXTENSION")
it.include("**${File.separatorChar}*.$MIGRATION_EXTENSION")
it.workingDirectory.set(File(project.buildDir, "sqldelight/migration_verification/${source.name.capitalize()}$name"))
it.workingDirectory = File(project.buildDir, "sqldelight/migration_verification/${source.name.capitalize()}$name")
it.group = SqlDelightPlugin.GROUP
it.description = "Verify ${source.name} $name migrations and CREATE statements match."
it.properties = getProperties()
it.verifyMigrations.set(verifyMigrations)
it.verifyDefinitions.set(verifyDefinitions)
it.verifyMigrations = verifyMigrations.get()
it.classpath.setFrom(intellijEnv, migrationEnv, configuration)
}

if (schemaOutputDirectory.isPresent) {
if (schemaOutputDirectory.getOrNull() != null) {
project.tasks.register("generate${source.name.capitalize()}${name}Schema", GenerateSchemaTask::class.java) {
it.projectName.set(project.name)
it.compilationUnit = getProperties().compilationUnits.single { it.name == source.name }
it.outputDirectory.set(schemaOutputDirectory)
it.outputDirectory = schemaOutputDirectory.get().asFile
it.source(sourceSet)
it.include("**${File.separatorChar}*.$SQLDELIGHT_EXTENSION")
it.include("**${File.separatorChar}*.$MIGRATION_EXTENSION")
it.group = SqlDelightPlugin.GROUP
it.description = "Generate a .db file containing the current $name schema for ${source.name}."
it.properties = getProperties()
it.verifyMigrations.set(verifyMigrations)
it.verifyMigrations = verifyMigrations.get()
it.classpath.setFrom(intellijEnv, migrationEnv, configuration)
}
}
Expand All @@ -309,8 +307,8 @@ abstract class SqlDelightDatabase @Inject constructor(
it.compilationUnit = getProperties().compilationUnits.single { it.name == source.name }
it.source(sourceSet)
it.include("**${File.separatorChar}*.$MIGRATION_EXTENSION")
it.migrationOutputExtension.set(migrationOutputFileFormat)
it.outputDirectory.set(migrationOutputDirectory)
it.migrationOutputExtension = migrationOutputFileFormat.get()
it.outputDirectory = migrationOutputDirectory.get().asFile
it.group = SqlDelightPlugin.GROUP
it.description = "Generate valid sql migration files for ${source.name} $name."
it.properties = getProperties()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,14 +21,15 @@ import app.cash.sqldelight.core.SqlDelightPropertiesFile
import app.cash.sqldelight.gradle.android.packageName
import app.cash.sqldelight.gradle.android.sqliteVersion
import app.cash.sqldelight.gradle.kotlin.linkSqlite
import com.android.build.gradle.api.AndroidBasePlugin
import org.gradle.api.Plugin
import org.gradle.api.Project
import org.gradle.api.artifacts.Dependency
import org.gradle.tooling.provider.model.ToolingModelBuilder
import org.gradle.tooling.provider.model.ToolingModelBuilderRegistry
import org.gradle.util.GradleVersion
import org.jetbrains.kotlin.gradle.plugin.KotlinBasePlugin
import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSetContainer
import org.jetbrains.kotlin.gradle.dsl.KotlinJsProjectExtension
import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension
import org.jetbrains.kotlin.gradle.plugin.sources.DefaultKotlinSourceSet
import java.util.concurrent.atomic.AtomicBoolean
import javax.inject.Inject

Expand All @@ -41,42 +42,40 @@ abstract class SqlDelightPlugin : Plugin<Project> {
@get:Inject
abstract val registry: ToolingModelBuilderRegistry

private lateinit var extension: SqlDelightExtension

override fun apply(project: Project) {
require(GradleVersion.current() >= GradleVersion.version(MIN_GRADLE_VERSION)) {
"SQLDelight requires Gradle version $MIN_GRADLE_VERSION or greater."
}

val extension = project.extensions.create("sqldelight", SqlDelightExtension::class.java).apply {
linkSqlite.convention(true)
}
extension = project.extensions.create("sqldelight", SqlDelightExtension::class.java)

project.plugins.withType(AndroidBasePlugin::class.java) {
val androidPluginHandler = { _: Plugin<*> ->
android.set(true)
project.afterEvaluate {
project.setupSqlDelightTasks(afterAndroid = true, extension)
project.setupSqlDelightTasks(afterAndroid = true)
}
}

project.plugins.withType(KotlinBasePlugin::class.java) {
kotlin.set(true)
}

project.tasks.register("generateSqlDelightInterface") {
it.group = GROUP
it.description = "Aggregation task which runs every interface generation task for every given source"
}

project.tasks.register("verifySqlDelightMigration") {
it.group = GROUP
it.description = "Aggregation task which runs every migration task for every given source"
}
project.plugins.withId("com.android.application", androidPluginHandler)
project.plugins.withId("com.android.library", androidPluginHandler)
project.plugins.withId("com.android.instantapp", androidPluginHandler)
project.plugins.withId("com.android.feature", androidPluginHandler)
project.plugins.withId("com.android.dynamic-feature", androidPluginHandler)

val kotlinPluginHandler = { _: Plugin<*> -> kotlin.set(true) }
project.plugins.withId("org.jetbrains.kotlin.multiplatform", kotlinPluginHandler)
project.plugins.withId("org.jetbrains.kotlin.android", kotlinPluginHandler)
project.plugins.withId("org.jetbrains.kotlin.jvm", kotlinPluginHandler)
project.plugins.withId("org.jetbrains.kotlin.js", kotlinPluginHandler)
project.plugins.withId("kotlin2js", kotlinPluginHandler)

project.afterEvaluate {
project.setupSqlDelightTasks(afterAndroid = false, extension)
project.setupSqlDelightTasks(afterAndroid = false)
}
}

private fun Project.setupSqlDelightTasks(afterAndroid: Boolean, extension: SqlDelightExtension) {
private fun Project.setupSqlDelightTasks(afterAndroid: Boolean) {
if (android.get() && !afterAndroid) return

check(kotlin.get()) {
Expand All @@ -85,36 +84,64 @@ abstract class SqlDelightPlugin : Plugin<Project> {
}

val isMultiplatform = project.plugins.hasPlugin("org.jetbrains.kotlin.multiplatform")
val isJsOnly = if (isMultiplatform) false else project.plugins.hasPlugin("org.jetbrains.kotlin.js")

val needsAsyncRuntime = extension.databases.any { it.generateAsync.get() }
val runtimeDependencies = buildList {
val runtimeDependencies = mutableListOf<Dependency>().apply {
add(project.dependencies.create("app.cash.sqldelight:runtime:$VERSION"))
if (needsAsyncRuntime) add(project.dependencies.create("app.cash.sqldelight:async-extensions:$VERSION"))
}

// Add the runtime dependency.
val sourceSetName = if (isMultiplatform) "commonMain" else "main"
val sourceSetApiConfigName =
project.extensions.getByType(KotlinSourceSetContainer::class.java).sourceSets.getByName(sourceSetName).apiConfigurationName
project.configurations.getByName(sourceSetApiConfigName).dependencies.addAll(runtimeDependencies)
when {
isMultiplatform -> {
val sourceSets =
project.extensions.getByType(KotlinMultiplatformExtension::class.java).sourceSets
val sourceSet = (sourceSets.getByName("commonMain") as DefaultKotlinSourceSet)
project.configurations.getByName(sourceSet.apiConfigurationName)
.dependencies.addAll(runtimeDependencies)
}
isJsOnly -> {
val sourceSets =
project.extensions.getByType(KotlinJsProjectExtension::class.java).sourceSets
val sourceSet = (sourceSets.getByName("main") as DefaultKotlinSourceSet)
project.configurations.getByName(sourceSet.apiConfigurationName)
.dependencies.addAll(runtimeDependencies)
}
else -> {
project.configurations.getByName("api").dependencies.addAll(runtimeDependencies)
}
}

if (extension.linkSqlite.get()) {
if (extension.linkSqlite.getOrElse(true)) {
project.linkSqlite()
}

extension.run {
if (databases.isEmpty() && android.get() && !isMultiplatform) {
// Default to a database for android named "Database" to keep things simple.
databases.create("Database") { database ->
database.packageName.set(project.packageName())
project.sqliteVersion()?.let(database::dialect)
}
databases.add(
objects.newInstance(SqlDelightDatabase::class.java, project, "Database").apply {
packageName.set(project.packageName())
project.sqliteVersion()?.let(::dialect)
},
)
} else if (databases.isEmpty()) {
logger.warn("SQLDelight Gradle plugin was applied but there are no databases set up.")
}

project.tasks.register("generateSqlDelightInterface") {
it.group = GROUP
it.description = "Aggregation task which runs every interface generation task for every given source"
}

project.tasks.register("verifySqlDelightMigration") {
it.group = GROUP
it.description = "Aggregation task which runs every migration task for every given source"
}

databases.forEach { database ->
if (!database.packageName.isPresent && android.get() && !isMultiplatform) {
if (database.packageName.getOrNull() == null && android.get() && !isMultiplatform) {
database.packageName.set(project.packageName())
}
if (!database.addedDialect && android.get() && !isMultiplatform) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
*/
package app.cash.sqldelight.gradle

import app.cash.sqldelight.VERSION
import app.cash.sqldelight.core.SqlDelightCompilationUnit
import app.cash.sqldelight.core.SqlDelightDatabaseProperties
import app.cash.sqldelight.core.SqlDelightEnvironment
Expand All @@ -40,20 +41,26 @@ import org.gradle.api.tasks.SkipWhenEmpty
import org.gradle.api.tasks.TaskAction
import org.gradle.workers.WorkAction
import org.gradle.workers.WorkParameters
import java.io.File
import java.util.ServiceLoader

@CacheableTask
abstract class SqlDelightTask : SqlDelightWorkerTask() {
@Suppress("unused")
// Required to invalidate the task on version updates.
@Input
val pluginVersion = VERSION

@get:OutputDirectory
abstract val outputDirectory: DirectoryProperty
var outputDirectory: File? = null

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

@get:Nested abstract var properties: SqlDelightDatabasePropertiesImpl

@get:Nested abstract var compilationUnit: SqlDelightCompilationUnitImpl

@get:Input abstract val verifyMigrations: Property<Boolean>
@Input var verifyMigrations: Boolean = false

@TaskAction
fun generateSqlDelightFiles() {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package app.cash.sqldelight.gradle

import app.cash.sqldelight.VERSION
import app.cash.sqldelight.core.SqlDelightCompilationUnit
import app.cash.sqldelight.core.SqlDelightDatabaseProperties
import app.cash.sqldelight.core.SqlDelightEnvironment
Expand Down Expand Up @@ -37,18 +38,23 @@ import kotlin.collections.ArrayList

@CacheableTask
abstract class VerifyMigrationTask : SqlDelightWorkerTask() {
@Suppress("unused")
// Required to invalidate the task on version updates.
@Input
val pluginVersion = VERSION

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

/** Directory where the database files are copied for the migration scripts to run against. */
@get:Internal abstract val workingDirectory: DirectoryProperty
@get:Internal abstract var workingDirectory: File

@get:Nested abstract var properties: SqlDelightDatabasePropertiesImpl

@get:Nested abstract var compilationUnit: SqlDelightCompilationUnitImpl

@get:Input abstract val verifyMigrations: Property<Boolean>
@Input var verifyMigrations: Boolean = false

@get:Input abstract val verifyDefinitions: Property<Boolean>
@Input var verifyDefinitions: Boolean = true

@get:Input abstract val driverProperties: MapProperty<String, String>

Expand All @@ -68,7 +74,7 @@ abstract class VerifyMigrationTask : SqlDelightWorkerTask() {
it.verifyMigrations.set(verifyMigrations)
it.compilationUnit.set(compilationUnit)
it.verifyDefinitions.set(verifyDefinitions)
it.driverProperties.set(driverProperties)
it.driverProperties.set(driverProperties.get())
it.outputFile.set(getDummyOutputFile())
}
}
Expand Down
Loading

0 comments on commit 4d2e8ff

Please sign in to comment.