diff --git a/.github/renovate.json b/.github/renovate.json index 45d03e7b..32957f54 100644 --- a/.github/renovate.json +++ b/.github/renovate.json @@ -88,6 +88,12 @@ "depNameTemplate": "androidx.hilt:hilt-navigation-compose", "datasourceTemplate": "maven" }, + { + "fileMatch": ["^.*Versions\\.kt$"], + "matchStrings": ["val metro: String = \"(?\\d+\\.\\d+\\.\\d+)\""], + "depNameTemplate": "dev.zacsweers.metro:dev.zacsweers.metro.gradle.plugin", + "datasourceTemplate": "maven" + }, { "fileMatch": ["^.*Versions\\.kt$"], "matchStrings": ["val composeBom: String = \"(?\\d+\\.\\d+\\.\\d+)\""], diff --git a/README.md b/README.md index 47bd383a..b7d63546 100644 --- a/README.md +++ b/README.md @@ -40,6 +40,7 @@ Then, you can use the versions.yaml in the `generate-project` command: - `--layers`: Number of layers (default: 5) - `--language`: kts (default), groovy, both - `--type`: android (default), jvm +- `--di`: hilt (default), metro, none - `--classes-module`: Number of classes per module (default: 5) - `--classes-module-type`: fixed (default), random - `--type-of-string-resources`: normal (default), large @@ -66,7 +67,7 @@ ProjectGenerator( language = Language.KTS, typeOfProjectRequested = TypeProjectRequested.ANDROID, classesPerModule = ClassesPerModule(ClassesPerModuleType.FIXED, 20), - versions = Versions(project = Project(jdk = "17")), + versions = Versions(project = Project(jdk = "17"), di = DependencyInjection.HILT), typeOfStringResources = TypeOfStringResources.LARGE, layers = 5, generateUnitTest = true, diff --git a/build.gradle.kts b/build.gradle.kts index abc84429..6633e81d 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -5,8 +5,6 @@ plugins { alias(libs.plugins.ktlint) } - project.extensions.getByType(KotlinJvmProjectExtension::class.java).apply { jvmToolchain(23) } - diff --git a/cli/src/main/kotlin/io/github/cdsap/projectgenerator/cli/GenerateVersionsYaml.kt b/cli/src/main/kotlin/io/github/cdsap/projectgenerator/cli/GenerateVersionsYaml.kt index b96bbd0c..337c4216 100644 --- a/cli/src/main/kotlin/io/github/cdsap/projectgenerator/cli/GenerateVersionsYaml.kt +++ b/cli/src/main/kotlin/io/github/cdsap/projectgenerator/cli/GenerateVersionsYaml.kt @@ -13,6 +13,7 @@ class GenerateVersionsYaml { | develocity: ${versions.project.develocity} | develocityUrl: ${versions.project.develocityUrl} | jdk: ${versions.project.jdk} + |di: ${versions.di} |kotlin: | kgp: ${versions.kotlin.kgp} | ksp: ${versions.kotlin.ksp} @@ -31,6 +32,8 @@ class GenerateVersionsYaml { | work: ${versions.android.work} | hilt: ${versions.android.hilt} | hiltAandroidx: ${versions.android.hiltAandroidx} + | metro: ${versions.android.metro} + | metroPlugin: ${versions.android.metroPlugin} | composeBom: ${versions.android.composeBom} |testing: | junit4: ${versions.testing.junit4} diff --git a/cli/src/main/kotlin/io/github/cdsap/projectgenerator/cli/Main.kt b/cli/src/main/kotlin/io/github/cdsap/projectgenerator/cli/Main.kt index dce446f1..fc48cd51 100644 --- a/cli/src/main/kotlin/io/github/cdsap/projectgenerator/cli/Main.kt +++ b/cli/src/main/kotlin/io/github/cdsap/projectgenerator/cli/Main.kt @@ -38,6 +38,7 @@ class GenerateProjects : CliktCommand(name = "generate-project") { private val modules by option().int().required() .check("max number of projects 4000") { it in (layers + 1)..4000 } private val type by option().choice("android", "jvm").default("android") + private val di: String by option().choice("hilt", "metro", "none").default("hilt") private val classesModule by option().int().default(5) private val classesModuleType: String by option().choice("fixed", "random").default("fixed") private val typeOfStringResources: String by option().choice("large", "normal").default("normal") @@ -62,7 +63,8 @@ class GenerateProjects : CliktCommand(name = "generate-project") { override fun run() { val typeOfProjectRequested = TypeProjectRequested.valueOf(type.uppercase()) val shape = Shape.valueOf(shape.uppercase()) - val versions = getVersions(versionsFile, develocityUrl, agp9) + val dependencyInjection = DependencyInjection.valueOf(di.uppercase()) + val versions = getVersions(versionsFile, develocityUrl, agp9).copy(di = dependencyInjection) val develocityEnabled = getDevelocityEnabled(develocity, develocityUrl) ProjectGenerator( modules, diff --git a/project-generator/src/main/kotlin/io/github/cdsap/projectgenerator/generator/android/AndroidApplication.kt b/project-generator/src/main/kotlin/io/github/cdsap/projectgenerator/generator/android/AndroidApplication.kt index 709a362e..f880a7e1 100644 --- a/project-generator/src/main/kotlin/io/github/cdsap/projectgenerator/generator/android/AndroidApplication.kt +++ b/project-generator/src/main/kotlin/io/github/cdsap/projectgenerator/generator/android/AndroidApplication.kt @@ -1,12 +1,21 @@ package io.github.cdsap.projectgenerator.generator.android +import io.github.cdsap.projectgenerator.model.DependencyInjection import io.github.cdsap.projectgenerator.model.LanguageAttributes import io.github.cdsap.projectgenerator.model.ProjectGraph import io.github.cdsap.projectgenerator.NameMappings +import io.github.cdsap.projectgenerator.generator.classes.GenerateDictionaryAndroid +import io.github.cdsap.projectgenerator.model.ClassTypeAndroid import java.io.File +import java.util.concurrent.CopyOnWriteArrayList class AndroidApplication { - fun createApplicationClass(node: ProjectGraph, lang: LanguageAttributes) { + fun createApplicationClass( + node: ProjectGraph, + lang: LanguageAttributes, + di: DependencyInjection, + dictionary: MutableMap> + ) { val layerDir = NameMappings.layerName(node.layer) val moduleDir = NameMappings.moduleName(node.id) val packageDir = NameMappings.modulePackageName(node.id) @@ -15,60 +24,94 @@ class AndroidApplication { appDir.mkdirs() val appFile = File(appDir, "MainApplication.kt") - // Create a more robust Application class that properly initializes Hilt - val appContent = """ - |package com.awesomeapp.$packageDir - | - |import android.app.Application - |import android.content.Context - |import androidx.hilt.work.HiltWorkerFactory - |import androidx.work.Configuration - |import dagger.hilt.android.HiltAndroidApp - |import dagger.hilt.android.qualifiers.ApplicationContext - |import javax.inject.Inject - | - |/** - | * Main application class with Hilt support - | */ - |@HiltAndroidApp - |class MainApplication : Application(){ - | - | override fun onCreate() { - | super.onCreate() - | // Application initialization here - | } - | - | companion object { - | /** - | * Gets an entry point from the Hilt component - | */ - | @JvmStatic - | fun getEntryPoint(@ApplicationContext context: Context, entryPoint: Class<*>): Any { - | return try { - | val entryPointAccessors = Class.forName("dagger.hilt.android.EntryPointAccessors") - | val getMethod = entryPointAccessors.getDeclaredMethod("fromApplication", Context::class.java, Class::class.java) - | getMethod.invoke(null, context.applicationContext, entryPoint) - | } catch (e: Exception) { - | throw RuntimeException("Error accessing Hilt entry point", e) - | } - | } - | - | /** - | * Gets a specific implementation from an entry point - | */ - | @JvmStatic - | inline fun getImplementation(@ApplicationContext context: Context, entryPoint: Class<*>): T { - | val ep = getEntryPoint(context, entryPoint) - | // Find method that returns T - | val method = entryPoint.methods.find { - | it.returnType == T::class.java - | } ?: throw RuntimeException("No method found returning") - | - | return method.invoke(ep) as T - | } - | } - |} - """.trimMargin() + val appContent = when (di) { + DependencyInjection.HILT -> """ + |package com.awesomeapp.$packageDir + | + |import android.app.Application + |import android.content.Context + |import androidx.hilt.work.HiltWorkerFactory + |import androidx.work.Configuration + |import dagger.hilt.android.HiltAndroidApp + |import dagger.hilt.android.qualifiers.ApplicationContext + |import javax.inject.Inject + | + |/** + | * Main application class with Hilt support + | */ + |@HiltAndroidApp + |class MainApplication : Application(){ + | + | override fun onCreate() { + | super.onCreate() + | // Application initialization here + | } + | + | companion object { + | /** + | * Gets an entry point from the Hilt component + | */ + | @JvmStatic + | fun getEntryPoint(@ApplicationContext context: Context, entryPoint: Class<*>): Any { + | return try { + | val entryPointAccessors = Class.forName("dagger.hilt.android.EntryPointAccessors") + | val getMethod = entryPointAccessors.getDeclaredMethod("fromApplication", Context::class.java, Class::class.java) + | getMethod.invoke(null, context.applicationContext, entryPoint) + | } catch (e: Exception) { + | throw RuntimeException("Error accessing Hilt entry point", e) + | } + | } + | + | /** + | * Gets a specific implementation from an entry point + | */ + | @JvmStatic + | inline fun getImplementation(@ApplicationContext context: Context, entryPoint: Class<*>): T { + | val ep = getEntryPoint(context, entryPoint) + | // Find method that returns T + | val method = entryPoint.methods.find { + | it.returnType == T::class.java + | } ?: throw RuntimeException("No method found returning") + | + | return method.invoke(ep) as T + | } + | } + |} + """.trimMargin() + + DependencyInjection.METRO -> { + val moduleId = NameMappings.moduleName(node.id) + val moduleNumber = node.id.split("_").last().toInt() + val viewModel = dictionary[moduleId] + ?.firstOrNull { it.type == ClassTypeAndroid.VIEWMODEL } + ?.className + ?: "Viewmodel${moduleNumber}_1" + """ + |package com.awesomeapp.$packageDir + | + |import android.app.Application + |import dev.zacsweers.metro.DependencyGraph + |import dev.zacsweers.metro.createGraph + | + |@DependencyGraph + |interface AppGraph { + | val viewModel: $viewModel + |} + | + |class MainApplication : Application() { + | val graph: AppGraph by lazy { createGraph() } + |} + """.trimMargin() + } + + DependencyInjection.NONE -> """ + |package com.awesomeapp.$packageDir + | + |import android.app.Application + | + |class MainApplication : Application() + """.trimMargin() + } appFile.writeText(appContent) } } diff --git a/project-generator/src/main/kotlin/io/github/cdsap/projectgenerator/generator/buildfiles/BuildFilesGeneratorAndroid.kt b/project-generator/src/main/kotlin/io/github/cdsap/projectgenerator/generator/buildfiles/BuildFilesGeneratorAndroid.kt index 222006e3..c61b72c9 100644 --- a/project-generator/src/main/kotlin/io/github/cdsap/projectgenerator/generator/buildfiles/BuildFilesGeneratorAndroid.kt +++ b/project-generator/src/main/kotlin/io/github/cdsap/projectgenerator/generator/buildfiles/BuildFilesGeneratorAndroid.kt @@ -6,10 +6,14 @@ import io.github.cdsap.projectgenerator.model.LanguageAttributes import io.github.cdsap.projectgenerator.model.ProjectGraph import io.github.cdsap.projectgenerator.model.TypeProject import io.github.cdsap.projectgenerator.model.Versions +import io.github.cdsap.projectgenerator.model.DependencyInjection import io.github.cdsap.projectgenerator.NameMappings import java.io.File -class BuildFilesGeneratorAndroid(val versions: Versions) : BuildFilesGenerator { +class BuildFilesGeneratorAndroid( + private val versions: Versions, + private val di: DependencyInjection +) : BuildFilesGenerator { override fun generateBuildFiles( node: ProjectGraph, lang: LanguageAttributes, @@ -37,7 +41,7 @@ class BuildFilesGeneratorAndroid(val versions: Versions) : BuildFilesGenerator { } } - val deps = AndroidToml().tomlImplementations(versions) + val deps = AndroidToml().tomlImplementations(versions, di) return """ |plugins { | id("awesome.androidapp.plugin") @@ -55,7 +59,7 @@ ${testImplementations.joinToString("\n").prependIndent(" ")} private fun createAndroidLibBuildFile(node: ProjectGraph, generateUnitTests: Boolean): String { val implementations = mutableSetOf() val testImplementations = mutableSetOf() - val deps = AndroidToml().tomlImplementations(versions) + val deps = AndroidToml().tomlImplementations(versions, di) // Add direct dependencies first (only from different layers) node.nodes.forEach { dependency -> if (dependency.layer != node.layer) { diff --git a/project-generator/src/main/kotlin/io/github/cdsap/projectgenerator/generator/classes/ClassGeneratorAndroid.kt b/project-generator/src/main/kotlin/io/github/cdsap/projectgenerator/generator/classes/ClassGeneratorAndroid.kt index e818ba46..a90d2311 100644 --- a/project-generator/src/main/kotlin/io/github/cdsap/projectgenerator/generator/classes/ClassGeneratorAndroid.kt +++ b/project-generator/src/main/kotlin/io/github/cdsap/projectgenerator/generator/classes/ClassGeneratorAndroid.kt @@ -17,7 +17,9 @@ data class GenerateDictionaryAndroid( val dependencies: List ) -class ClassGeneratorAndroid : +class ClassGeneratorAndroid( + private val di: DependencyInjection +) : ClassGenerator { @@ -54,7 +56,9 @@ class ClassGeneratorAndroid : writeClassFile(classContent, classDefinition, moduleDefinition, projectName) } - createDaggerModule(moduleDefinition, projectName, a) + if (di == DependencyInjection.HILT) { + createDaggerModule(moduleDefinition, projectName, a) + } } @@ -224,7 +228,6 @@ class ClassGeneratorAndroid : val imports = buildString { appendLine("import androidx.lifecycle.ViewModel") appendLine("import androidx.lifecycle.viewModelScope") - appendLine("import dagger.hilt.android.lifecycle.HiltViewModel") appendLine("import kotlinx.coroutines.launch") appendLine("import kotlinx.coroutines.coroutineScope") appendLine("import kotlinx.coroutines.async") @@ -233,7 +236,16 @@ class ClassGeneratorAndroid : appendLine("import kotlinx.coroutines.flow.StateFlow") appendLine("import kotlinx.coroutines.flow.asStateFlow") appendLine("import kotlinx.coroutines.Dispatchers") - appendLine("import javax.inject.Inject") + when (di) { + DependencyInjection.HILT -> { + appendLine("import dagger.hilt.android.lifecycle.HiltViewModel") + appendLine("import javax.inject.Inject") + } + DependencyInjection.METRO -> { + appendLine("import dev.zacsweers.metro.Inject") + } + DependencyInjection.NONE -> {} + } dependencies.forEach { dep -> val depModuleId = dep.sourceModuleId val s = a.filter { it.key == depModuleId } @@ -276,13 +288,22 @@ class ClassGeneratorAndroid : """.trimIndent() } + val diAnnotation = when (di) { + DependencyInjection.HILT -> "@HiltViewModel" + DependencyInjection.METRO, DependencyInjection.NONE -> "" + } + val injectAnnotation = when (di) { + DependencyInjection.HILT, DependencyInjection.METRO -> "@Inject " + DependencyInjection.NONE -> "" + } + return """ |package $packageName | |$imports | - |@HiltViewModel - |class $className @Inject constructor( + |$diAnnotation + |class $className ${injectAnnotation}constructor( | $constructorParams |) : ViewModel() { | private val _state = MutableStateFlow("") @@ -314,8 +335,16 @@ class ClassGeneratorAndroid : appendLine("import kotlinx.coroutines.coroutineScope") appendLine("import kotlinx.coroutines.async") appendLine("import kotlinx.coroutines.awaitAll") - appendLine("import javax.inject.Inject") - appendLine("import javax.inject.Singleton") + when (di) { + DependencyInjection.HILT -> { + appendLine("import javax.inject.Inject") + appendLine("import javax.inject.Singleton") + } + DependencyInjection.METRO -> { + appendLine("import dev.zacsweers.metro.Inject") + } + DependencyInjection.NONE -> {} + } dependencies.forEach { dep -> val depModuleId = dep.sourceModuleId val matches = a.filter { it.key == depModuleId } @@ -351,13 +380,19 @@ class ClassGeneratorAndroid : """.trimIndent() } + val singletonAnnotation = if (di == DependencyInjection.HILT) "@Singleton" else "" + val injectAnnotation = when (di) { + DependencyInjection.HILT, DependencyInjection.METRO -> "@Inject " + DependencyInjection.NONE -> "" + } + return """ |package $packageName | |$imports | - |@Singleton - |class $className @Inject constructor( + |$singletonAnnotation + |class $className ${injectAnnotation}constructor( | $constructorParams |) { | suspend fun getData(): String = withContext(Dispatchers.IO) { @@ -387,9 +422,12 @@ class ClassGeneratorAndroid : appendLine("import androidx.compose.ui.platform.ComposeView") appendLine("import androidx.fragment.app.Fragment") appendLine("import androidx.fragment.app.viewModels") - appendLine("import dagger.hilt.android.AndroidEntryPoint") + if (di == DependencyInjection.HILT) { + appendLine("import dagger.hilt.android.AndroidEntryPoint") + } } + val entryPointAnnotation = if (di == DependencyInjection.HILT) "@AndroidEntryPoint" else "" val viewModelClass = "Feature${moduleNumber}_1" return """ @@ -397,7 +435,7 @@ class ClassGeneratorAndroid : | |$imports | - |@AndroidEntryPoint + |$entryPointAnnotation |class $className : Fragment() { | | override fun onCreateView( @@ -416,14 +454,24 @@ class ClassGeneratorAndroid : } private fun generateApi(packageName: String, className: String): String { + val injectImport = when (di) { + DependencyInjection.HILT -> "import javax.inject.Inject" + DependencyInjection.METRO -> "import dev.zacsweers.metro.Inject" + DependencyInjection.NONE -> "" + } + val injectAnnotation = when (di) { + DependencyInjection.HILT, DependencyInjection.METRO -> "@Inject " + DependencyInjection.NONE -> "" + } + return """ |package $packageName | |import kotlinx.coroutines.Dispatchers |import kotlinx.coroutines.withContext - |import javax.inject.Inject + |$injectImport | - |class $className @Inject constructor() { + |class $className ${injectAnnotation}constructor() { | suspend fun fetchData(): String = withContext(Dispatchers.IO) { | "Data from $className API" | } @@ -432,6 +480,29 @@ class ClassGeneratorAndroid : } private fun generateWorker(packageName: String, className: String): String { + if (di != DependencyInjection.HILT) { + return """ + |package $packageName + | + |import android.content.Context + |import androidx.work.CoroutineWorker + |import androidx.work.WorkerParameters + | + |class $className( + | context: Context, + | params: WorkerParameters + |) : CoroutineWorker(context, params) { + | override suspend fun doWork(): Result { + | return try { + | Thread.sleep(100) + | Result.success() + | } catch (e: Exception) { + | Result.failure() + | } + | } + |} + """.trimMargin() + } return """ |package $packageName | @@ -478,15 +549,19 @@ class ClassGeneratorAndroid : appendLine("import androidx.compose.ui.Alignment") appendLine("import androidx.compose.ui.Modifier") appendLine("import com.awesomeapp.${NameMappings.modulePackageName(moduleId)}.ui.theme.FeatureTheme") - appendLine("import dagger.hilt.android.AndroidEntryPoint") + if (di == DependencyInjection.HILT) { + appendLine("import dagger.hilt.android.AndroidEntryPoint") + } } + val entryPointAnnotation = if (di == DependencyInjection.HILT) "@AndroidEntryPoint" else "" + return """ |package $packageName | |$imports | - |@AndroidEntryPoint + |$entryPointAnnotation |class $className : ComponentActivity() { | private val viewModel: $viewModelClass by viewModels() | @@ -516,17 +591,20 @@ class ClassGeneratorAndroid : appendLine("import android.app.Service") appendLine("import android.content.Intent") appendLine("import android.os.IBinder") - appendLine("import dagger.hilt.android.AndroidEntryPoint") + if (di == DependencyInjection.HILT) { + appendLine("import dagger.hilt.android.AndroidEntryPoint") + } appendLine("import kotlinx.coroutines.*") - appendLine("import javax.inject.Inject") } + val entryPointAnnotation = if (di == DependencyInjection.HILT) "@AndroidEntryPoint" else "" + return """ |package $packageName | |$imports | - |@AndroidEntryPoint + |$entryPointAnnotation |class $className : Service() { | private val serviceJob = Job() | private val serviceScope = CoroutineScope(Dispatchers.Default + serviceJob) @@ -579,14 +657,23 @@ class ClassGeneratorAndroid : } private fun generateUseCase(packageName: String, className: String, moduleNumber: String): String { + val injectImport = when (di) { + DependencyInjection.HILT -> "import javax.inject.Inject" + DependencyInjection.METRO -> "import dev.zacsweers.metro.Inject" + DependencyInjection.NONE -> "" + } + val injectAnnotation = when (di) { + DependencyInjection.HILT, DependencyInjection.METRO -> "@Inject " + DependencyInjection.NONE -> "" + } return """ |package $packageName | |import kotlinx.coroutines.flow.Flow |import kotlinx.coroutines.flow.flow - |import javax.inject.Inject + |$injectImport | - |class $className @Inject constructor() { + |class $className ${injectAnnotation}constructor() { | operator fun invoke(): Flow = flow { | emit("Data from $className UseCase") | } diff --git a/project-generator/src/main/kotlin/io/github/cdsap/projectgenerator/generator/includedbuild/CompositeBuildBuildGradle.kt b/project-generator/src/main/kotlin/io/github/cdsap/projectgenerator/generator/includedbuild/CompositeBuildBuildGradle.kt index c7897cbd..99b0c02b 100644 --- a/project-generator/src/main/kotlin/io/github/cdsap/projectgenerator/generator/includedbuild/CompositeBuildBuildGradle.kt +++ b/project-generator/src/main/kotlin/io/github/cdsap/projectgenerator/generator/includedbuild/CompositeBuildBuildGradle.kt @@ -1,15 +1,21 @@ package io.github.cdsap.projectgenerator.generator.includedbuild +import io.github.cdsap.projectgenerator.model.DependencyInjection import io.github.cdsap.projectgenerator.model.TypeProjectRequested import io.github.cdsap.projectgenerator.model.Versions class CompositeBuildBuildGradle { - fun get(versions: Versions, requested: TypeProjectRequested): String { + fun get(versions: Versions, requested: TypeProjectRequested, di: DependencyInjection): String { val classpath = if (requested == TypeProjectRequested.ANDROID) { + val diClasspath = when (di) { + DependencyInjection.HILT -> "implementation(libs.hilt.plugin)" + DependencyInjection.METRO -> "implementation(libs.metro.gradle.plugin)" + DependencyInjection.NONE -> "" + } """ implementation(libs.android.gradle.plugin) - implementation(libs.hilt.plugin) + $diClasspath """ } else { "" diff --git a/project-generator/src/main/kotlin/io/github/cdsap/projectgenerator/generator/plugins/android/CompositeBuildPluginAndroidApp.kt b/project-generator/src/main/kotlin/io/github/cdsap/projectgenerator/generator/plugins/android/CompositeBuildPluginAndroidApp.kt index 60422654..145a7cf9 100644 --- a/project-generator/src/main/kotlin/io/github/cdsap/projectgenerator/generator/plugins/android/CompositeBuildPluginAndroidApp.kt +++ b/project-generator/src/main/kotlin/io/github/cdsap/projectgenerator/generator/plugins/android/CompositeBuildPluginAndroidApp.kt @@ -1,11 +1,12 @@ package io.github.cdsap.projectgenerator.generator.plugins.android import io.github.cdsap.projectgenerator.generator.extension.isAgp9 +import io.github.cdsap.projectgenerator.model.DependencyInjection import io.github.cdsap.projectgenerator.model.Processor import io.github.cdsap.projectgenerator.model.Versions class CompositeBuildPluginAndroidApp { - fun get(versions: Versions) = """ + fun get(versions: Versions, di: DependencyInjection) = """ |package com.logic | |import org.gradle.api.Plugin @@ -25,8 +26,8 @@ class CompositeBuildPluginAndroidApp { | with(pluginManager) { | apply("com.android.application") | ${provideKgpBasedOnAgp(versions)} - | ${provideKotlinProcessor(versions)} - | apply("dagger.hilt.android.plugin") + | ${provideKotlinProcessor(versions, di)} + | ${applyDiPlugin(di)} | apply("org.jetbrains.kotlin.plugin.compose") | } | @@ -57,17 +58,7 @@ class CompositeBuildPluginAndroidApp { | target.extensions.getByType(org.gradle.api.plugins.JavaPluginExtension::class.java).apply { | toolchain.languageVersion.set(org.gradle.jvm.toolchain.JavaLanguageVersion.of(${versions.project.jdk})) | } - | // Hilt missing Java Toolchain support https://github.com/google/dagger/issues/4623 - | val toolchains = target.extensions.getByType(JavaToolchainService::class.java) - | target.tasks.withType(JavaCompile::class.java) - | .matching { it.name.startsWith("hiltJavaCompile") } - | .configureEach { - | javaCompiler.set( - | toolchains.compilerFor { - | languageVersion.set(JavaLanguageVersion.of(${versions.project.jdk})) - | } - | ) - | } + | ${hiltToolchainFix(versions, di)} | | dependencies { | @@ -77,13 +68,43 @@ class CompositeBuildPluginAndroidApp { |} |""".trimMargin() - fun provideKotlinProcessor(versions: Versions) = if (versions.kotlin.kotlinProcessor.processor == Processor.KAPT) + fun provideKotlinProcessor(versions: Versions, di: DependencyInjection) = if (versions.kotlin.kotlinProcessor.processor == Processor.KAPT) """apply("kotlin-kapt")""" - else + else if( di == DependencyInjection.HILT) """apply("com.google.devtools.ksp")""" + else + "" fun provideKgpBasedOnAgp(versions: Versions) = if (!versions.android.agp.isAgp9()) """apply("org.jetbrains.kotlin.android")""" else """""" + + fun applyDiPlugin(di: DependencyInjection): String { + return when (di) { + DependencyInjection.HILT -> """apply("dagger.hilt.android.plugin")""" + DependencyInjection.METRO -> """apply("dev.zacsweers.metro")""" + DependencyInjection.NONE -> """""" + } + } + + fun hiltToolchainFix(versions: Versions, di: DependencyInjection): String { + return if (di == DependencyInjection.HILT) { + """ + // Hilt missing Java Toolchain support https://github.com/google/dagger/issues/4623 + val toolchains = target.extensions.getByType(JavaToolchainService::class.java) + target.tasks.withType(JavaCompile::class.java) + .matching { it.name.startsWith("hiltJavaCompile") } + .configureEach { + javaCompiler.set( + toolchains.compilerFor { + languageVersion.set(JavaLanguageVersion.of(${versions.project.jdk})) + } + ) + } + """.trimIndent() + } else { + "" + } + } } diff --git a/project-generator/src/main/kotlin/io/github/cdsap/projectgenerator/generator/plugins/android/CompositeBuildPluginAndroidLib.kt b/project-generator/src/main/kotlin/io/github/cdsap/projectgenerator/generator/plugins/android/CompositeBuildPluginAndroidLib.kt index 151a31fb..7ff8158c 100644 --- a/project-generator/src/main/kotlin/io/github/cdsap/projectgenerator/generator/plugins/android/CompositeBuildPluginAndroidLib.kt +++ b/project-generator/src/main/kotlin/io/github/cdsap/projectgenerator/generator/plugins/android/CompositeBuildPluginAndroidLib.kt @@ -1,11 +1,12 @@ package io.github.cdsap.projectgenerator.generator.plugins.android import io.github.cdsap.projectgenerator.generator.extension.isAgp9 +import io.github.cdsap.projectgenerator.model.DependencyInjection import io.github.cdsap.projectgenerator.model.Processor import io.github.cdsap.projectgenerator.model.Versions class CompositeBuildPluginAndroidLib { - fun get(versions: Versions) = """ + fun get(versions: Versions, di: DependencyInjection) = """ |package com.logic | |import org.gradle.api.Plugin @@ -22,12 +23,12 @@ class CompositeBuildPluginAndroidLib { | with(pluginManager) { | apply("com.android.library") | ${provideKgpBasedOnAgp(versions)} - | ${provideKotlinProcessor(versions)} - | apply("dagger.hilt.android.plugin") + | ${provideKotlinProcessor(versions,di)} + | ${applyDiPlugin(di)} | apply("org.jetbrains.kotlin.plugin.compose") | } | - | extensions.configure { + | extensions.configure { | namespace = "com.awesome." + target.name.replace(":","_").replace("-", "") | compileSdk = 36 | defaultConfig { @@ -64,13 +65,23 @@ class CompositeBuildPluginAndroidLib { |} |""".trimMargin() - fun provideKotlinProcessor(versions: Versions) = if (versions.kotlin.kotlinProcessor.processor == Processor.KAPT) + fun provideKotlinProcessor(versions: Versions, di: DependencyInjection) = if (versions.kotlin.kotlinProcessor.processor == Processor.KAPT) """apply("kotlin-kapt")""" - else + else if( di == DependencyInjection.HILT) """apply("com.google.devtools.ksp")""" + else + "" fun provideKgpBasedOnAgp(versions: Versions) = if (!versions.android.agp.isAgp9()) """apply("org.jetbrains.kotlin.android")""" else """""" + + fun applyDiPlugin(di: DependencyInjection): String { + return when (di) { + DependencyInjection.HILT -> """apply("dagger.hilt.android.plugin")""" + DependencyInjection.METRO -> """apply("dev.zacsweers.metro")""" + DependencyInjection.NONE -> """""" + } + } } diff --git a/project-generator/src/main/kotlin/io/github/cdsap/projectgenerator/generator/resources/ResourceGenerator.kt b/project-generator/src/main/kotlin/io/github/cdsap/projectgenerator/generator/resources/ResourceGenerator.kt index 69524c91..6b3a8ac7 100644 --- a/project-generator/src/main/kotlin/io/github/cdsap/projectgenerator/generator/resources/ResourceGenerator.kt +++ b/project-generator/src/main/kotlin/io/github/cdsap/projectgenerator/generator/resources/ResourceGenerator.kt @@ -9,6 +9,7 @@ import io.github.cdsap.projectgenerator.generator.android.ValuesStrings import io.github.cdsap.projectgenerator.writer.ResourceGeneratorA import io.github.cdsap.projectgenerator.NameMappings import io.github.cdsap.projectgenerator.generator.classes.GenerateDictionaryAndroid +import io.github.cdsap.projectgenerator.model.DependencyInjection import io.github.cdsap.projectgenerator.model.LanguageAttributes import io.github.cdsap.projectgenerator.model.ProjectGraph import io.github.cdsap.projectgenerator.model.TypeOfStringResources @@ -16,7 +17,9 @@ import io.github.cdsap.projectgenerator.model.TypeProject import java.io.File import java.util.concurrent.CopyOnWriteArrayList -class ResourceGenerator() : ResourceGeneratorA { +class ResourceGenerator( + private val di: DependencyInjection +) : ResourceGeneratorA { override fun generate( node: ProjectGraph, @@ -46,7 +49,7 @@ class ResourceGenerator() : ResourceGeneratorA { ) { val (layoutDir, valuesDir, manifestDir) = createResources(lang, node) Manifest().createManifest(manifestDir, node.layer, NameMappings.moduleName(node.id), TypeProject.ANDROID_APP, dictionary) - AndroidApplication().createApplicationClass(node, lang) + AndroidApplication().createApplicationClass(node, lang, di, dictionary) val moduleDir = NameMappings.moduleName(node.id) createLayoutFiles(layoutDir, moduleDir) createValueFiles(valuesDir, moduleDir, typeOfStringResources) diff --git a/project-generator/src/main/kotlin/io/github/cdsap/projectgenerator/generator/rootproject/BuildGradle.kt b/project-generator/src/main/kotlin/io/github/cdsap/projectgenerator/generator/rootproject/BuildGradle.kt index 17ba7929..571722ca 100644 --- a/project-generator/src/main/kotlin/io/github/cdsap/projectgenerator/generator/rootproject/BuildGradle.kt +++ b/project-generator/src/main/kotlin/io/github/cdsap/projectgenerator/generator/rootproject/BuildGradle.kt @@ -1,11 +1,12 @@ package io.github.cdsap.projectgenerator.generator.rootproject +import io.github.cdsap.projectgenerator.model.DependencyInjection import io.github.cdsap.projectgenerator.model.Processor import io.github.cdsap.projectgenerator.model.Versions class BuildGradle { - fun getAndroid(versions: Versions) = """ + fun getAndroid(versions: Versions, di: DependencyInjection) = """ plugins { alias(libs.plugins.kotlin.jvm) apply false alias(libs.plugins.kotlin.android) apply false @@ -13,7 +14,7 @@ class BuildGradle { alias(libs.plugins.android.application) apply false alias(libs.plugins.android.library) apply false ${provideKotlinProcessor(versions)} - alias(libs.plugins.hilt) apply false + ${diPlugins(di)} ${additionalBuildGradlePlugins(versions)} } """.trimIndent() @@ -31,6 +32,14 @@ class BuildGradle { else """alias(libs.plugins.kotlin.ksp) apply false""" + fun diPlugins(di: DependencyInjection): String { + return when (di) { + DependencyInjection.HILT -> "alias(libs.plugins.hilt) apply false" + DependencyInjection.METRO -> "alias(libs.plugins.metro) apply false" + DependencyInjection.NONE -> "" + } + } + fun additionalBuildGradlePlugins(versions: Versions): String { var additionalPlugins = "" versions.additionalBuildGradleRootPlugins.forEach { diff --git a/project-generator/src/main/kotlin/io/github/cdsap/projectgenerator/generator/rootproject/GradleProperties.kt b/project-generator/src/main/kotlin/io/github/cdsap/projectgenerator/generator/rootproject/GradleProperties.kt index 7fc75a0a..824a75b7 100644 --- a/project-generator/src/main/kotlin/io/github/cdsap/projectgenerator/generator/rootproject/GradleProperties.kt +++ b/project-generator/src/main/kotlin/io/github/cdsap/projectgenerator/generator/rootproject/GradleProperties.kt @@ -1,6 +1,7 @@ package io.github.cdsap.projectgenerator.generator.rootproject import io.github.cdsap.projectgenerator.generator.extension.isAgp9 +import io.github.cdsap.projectgenerator.model.DependencyInjection import io.github.cdsap.projectgenerator.model.Processor import io.github.cdsap.projectgenerator.model.Versions @@ -23,7 +24,7 @@ class GradleProperties { // Hilt is not compatible with AGP9, if AGP9 is enabled we need to disable android.newDsl=false private fun disableNewDslInAGP9BecauseHilt(versions: Versions): String { - return if (versions.android.agp.isAgp9()) { + return if (versions.di == DependencyInjection.HILT && versions.android.agp.isAgp9()) { "android.newDsl=false" } else "" } diff --git a/project-generator/src/main/kotlin/io/github/cdsap/projectgenerator/generator/toml/AndroidToml.kt b/project-generator/src/main/kotlin/io/github/cdsap/projectgenerator/generator/toml/AndroidToml.kt index 99070755..e9fe83cc 100644 --- a/project-generator/src/main/kotlin/io/github/cdsap/projectgenerator/generator/toml/AndroidToml.kt +++ b/project-generator/src/main/kotlin/io/github/cdsap/projectgenerator/generator/toml/AndroidToml.kt @@ -1,5 +1,6 @@ package io.github.cdsap.projectgenerator.generator.toml +import io.github.cdsap.projectgenerator.model.DependencyInjection import io.github.cdsap.projectgenerator.model.Processor import io.github.cdsap.projectgenerator.model.Versions @@ -20,8 +21,8 @@ class AndroidToml { activity = "${version.android.activity}" constraintlayout = "${version.android.constraintlayout}" work = "${version.android.work}" - hilt = "${version.android.hilt}" - hilt-androidx = "${version.android.hiltAandroidx}" + ${hiltVersions(version, version.di)} + ${metroVersions(version, version.di)} compose-bom = "${version.android.composeBom}" junit4 = "${version.testing.junit4}" junit5 = "${version.testing.junit5}" @@ -46,12 +47,8 @@ class AndroidToml { activity-ktx = { group = "androidx.activity", name = "activity-ktx", version.ref = "activity" } constraintlayout = { group = "androidx.constraintlayout", name = "constraintlayout", version.ref = "constraintlayout" } work-runtime-ktx = { group = "androidx.work", name = "work-runtime-ktx", version.ref = "work" } - hilt-android = { group = "com.google.dagger", name = "hilt-android", version.ref = "hilt" } - hilt-work = { group = "androidx.hilt", name = "hilt-work", version.ref = "hilt-androidx" } - hilt-compiler = { group = "com.google.dagger", name = "hilt-compiler", version.ref = "hilt" } - hilt-android-testing = { group = "com.google.dagger", name = "hilt-android-testing", version.ref = "hilt" } - hilt-compiler-androidx = { group = "androidx.hilt", name = "hilt-compiler", version.ref = "hilt-androidx" } - hilt-compiler-android-androidx = { group = "androidx.hilt", name = "hilt-android", version.ref = "hilt-androidx" } + ${hiltLibraries(version.di)} + ${metroLibraries(version.di)} kotlin-jvm-metadata = { group = "org.jetbrains.kotlin", name = "kotlin-metadata-jvm", version.ref = "kotlin"} compose-bom = { group = "androidx.compose", name = "compose-bom", version.ref = "compose-bom" } @@ -82,20 +79,22 @@ class AndroidToml { # Dependencies of the included build-logic android-gradle-plugin = { group = "com.android.tools.build", name = "gradle", version.ref = "agp" } kotlin-plugin = { group = "org.jetbrains.kotlin", name = "kotlin-gradle-plugin", version.ref = "kotlin" } - hilt-plugin = { group = "com.google.dagger", name = "hilt-android-gradle-plugin", version.ref = "hilt" } + ${hiltBuildLogicLibrary(version.di)} + ${metroBuildLogicLibrary(version.di)} kotlin-compose-plugin = { group = "org.jetbrains.kotlin.plugin.compose", name = "org.jetbrains.kotlin.plugin.compose.gradle.plugin", version.ref="kotlin" } [plugins] android-application = { id = "com.android.application", version.ref = "agp" } android-library = { id = "com.android.library", version.ref = "agp" } - hilt = { id = "com.google.dagger.hilt.android", version.ref = "hilt" } + ${hiltPlugin(version.di)} + ${metroPlugin(version.di)} kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" } kotlin-jvm = { id = "org.jetbrains.kotlin.jvm", version.ref = "kotlin" } kotlin-compose = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin" } kotlin-ksp = { id ="com.google.devtools.ksp", version.ref = "ksp" } """.trimIndent() - fun tomlImplementations(version: Versions) = """ + fun tomlImplementations(version: Versions, di: DependencyInjection) = """ |implementation(libs.androidx.core.ktx) |implementation(libs.appcompat) |implementation(libs.material) @@ -108,15 +107,8 @@ class AndroidToml { |implementation(libs.activity.ktx) |implementation(libs.constraintlayout) |implementation(libs.work.runtime.ktx) - |implementation(libs.hilt.work) - |implementation(libs.hilt.android) - - |${kotlinProcessor(version)}(libs.hilt.compiler.androidx) - |${kotlinProcessor(version)}(libs.hilt.compiler) - |${kotlinProcessor(version)}(libs.kotlin.jvm.metadata) - |${kotlinProcessor(version)}Test(libs.hilt.compiler) - |${kotlinProcessor(version)}AndroidTest(libs.hilt.compiler) - |testImplementation(libs.hilt.android.testing) + |${hiltDependencies(version, di)} + |${metroDependencies(di)} |implementation(platform(libs.compose.bom)) |implementation(libs.compose.ui) @@ -151,4 +143,109 @@ class AndroidToml { return "ksp" } } + + private fun hiltVersions(version: Versions, di: DependencyInjection): String { + return if (di == DependencyInjection.HILT) { + """ + hilt = "${version.android.hilt}" + hilt-androidx = "${version.android.hiltAandroidx}" + """.trimIndent() + } else { + "" + } + } + + private fun metroVersions(version: Versions, di: DependencyInjection): String { + return if (di == DependencyInjection.METRO) { + """ + metro = "${version.android.metro}" + metro-plugin = "${version.android.metroPlugin}" + """.trimIndent() + } else { + "" + } + } + + private fun hiltLibraries(di: DependencyInjection): String { + return if (di == DependencyInjection.HILT) { + """ + hilt-android = { group = "com.google.dagger", name = "hilt-android", version.ref = "hilt" } + hilt-work = { group = "androidx.hilt", name = "hilt-work", version.ref = "hilt-androidx" } + hilt-compiler = { group = "com.google.dagger", name = "hilt-compiler", version.ref = "hilt" } + hilt-android-testing = { group = "com.google.dagger", name = "hilt-android-testing", version.ref = "hilt" } + hilt-compiler-androidx = { group = "androidx.hilt", name = "hilt-compiler", version.ref = "hilt-androidx" } + hilt-compiler-android-androidx = { group = "androidx.hilt", name = "hilt-android", version.ref = "hilt-androidx" } + """.trimIndent() + } else { + "" + } + } + + private fun metroLibraries(di: DependencyInjection): String { + return if (di == DependencyInjection.METRO) { + """ + metro-runtime = { group = "dev.zacsweers.metro", name = "runtime", version.ref = "metro" } + """.trimIndent() + } else { + "" + } + } + + private fun hiltBuildLogicLibrary(di: DependencyInjection): String { + return if (di == DependencyInjection.HILT) { + """hilt-plugin = { group = "com.google.dagger", name = "hilt-android-gradle-plugin", version.ref = "hilt" }""" + } else { + "" + } + } + + private fun metroBuildLogicLibrary(di: DependencyInjection): String { + return if (di == DependencyInjection.METRO) { + """metro-gradle-plugin = { group = "dev.zacsweers.metro", name = "dev.zacsweers.metro.gradle.plugin", version.ref = "metro-plugin" }""" + } else { + "" + } + } + + private fun hiltPlugin(di: DependencyInjection): String { + return if (di == DependencyInjection.HILT) { + """hilt = { id = "com.google.dagger.hilt.android", version.ref = "hilt" }""" + } else { + "" + } + } + + private fun metroPlugin(di: DependencyInjection): String { + return if (di == DependencyInjection.METRO) { + """metro = { id = "dev.zacsweers.metro", version.ref = "metro-plugin" }""" + } else { + "" + } + } + + private fun hiltDependencies(version: Versions, di: DependencyInjection): String { + return if (di == DependencyInjection.HILT) { + """ + implementation(libs.hilt.work) + implementation(libs.hilt.android) + + ${kotlinProcessor(version)}(libs.hilt.compiler.androidx) + ${kotlinProcessor(version)}(libs.hilt.compiler) + ${kotlinProcessor(version)}(libs.kotlin.jvm.metadata) + ${kotlinProcessor(version)}Test(libs.hilt.compiler) + ${kotlinProcessor(version)}AndroidTest(libs.hilt.compiler) + testImplementation(libs.hilt.android.testing) + """.trimIndent() + } else { + "" + } + } + + private fun metroDependencies(di: DependencyInjection): String { + return if (di == DependencyInjection.METRO) { + "implementation(libs.metro.runtime)" + } else { + "" + } + } } diff --git a/project-generator/src/main/kotlin/io/github/cdsap/projectgenerator/model/DependencyInjection.kt b/project-generator/src/main/kotlin/io/github/cdsap/projectgenerator/model/DependencyInjection.kt new file mode 100644 index 00000000..87dbd985 --- /dev/null +++ b/project-generator/src/main/kotlin/io/github/cdsap/projectgenerator/model/DependencyInjection.kt @@ -0,0 +1,7 @@ +package io.github.cdsap.projectgenerator.model + +enum class DependencyInjection { + HILT, + METRO, + NONE, +} diff --git a/project-generator/src/main/kotlin/io/github/cdsap/projectgenerator/model/Versions.kt b/project-generator/src/main/kotlin/io/github/cdsap/projectgenerator/model/Versions.kt index 3bc41edb..e908b5c0 100644 --- a/project-generator/src/main/kotlin/io/github/cdsap/projectgenerator/model/Versions.kt +++ b/project-generator/src/main/kotlin/io/github/cdsap/projectgenerator/model/Versions.kt @@ -7,6 +7,7 @@ data class Versions( val android: Android = Android(), val testing: Testing = Testing(), val project: Project = Project(), + val di: DependencyInjection = DependencyInjection.HILT, val additionalBuildGradleRootPlugins: List = listOf( AdditionalPlugin( "com.autonomousapps.dependency-analysis", @@ -73,8 +74,10 @@ data class Android( val activity: String = "1.12.3", val constraintlayout: String = "2.2.1", val work: String = "2.11.1", - val hilt: String = "2.57.2", + val hilt: String = "2.59.1", val hiltAandroidx: String = "1.3.0", + val metro: String = "0.10.2", + val metroPlugin: String = "0.10.2", val composeBom: String = "2026.01.01", val robolectric: String = "4.16.1", val espresso: String = "3.7.0", diff --git a/project-generator/src/main/kotlin/io/github/cdsap/projectgenerator/writer/AndroidModulesWriter.kt b/project-generator/src/main/kotlin/io/github/cdsap/projectgenerator/writer/AndroidModulesWriter.kt index 768c4bd7..d6f7e718 100644 --- a/project-generator/src/main/kotlin/io/github/cdsap/projectgenerator/writer/AndroidModulesWriter.kt +++ b/project-generator/src/main/kotlin/io/github/cdsap/projectgenerator/writer/AndroidModulesWriter.kt @@ -13,14 +13,15 @@ class AndroidModulesWriter( languages: List, typeOfStringResources: TypeOfStringResources, generateUnitTest: Boolean, - versions: Versions + versions: Versions, + di: DependencyInjection ) : ModulesWrite( - classGenerator = ClassGeneratorAndroid(), + classGenerator = ClassGeneratorAndroid(di), classPlanner = ModuleClassPlannerAndroid(), testGenerator = TestGeneratorAndroid(), - resourceGeneratorA = ResourceGenerator(), + resourceGeneratorA = ResourceGenerator(di), generateUnitTest = generateUnitTest, - buildFilesGenerator = BuildFilesGeneratorAndroid(versions), + buildFilesGenerator = BuildFilesGeneratorAndroid(versions, di), resources = typeOfStringResources, nodes = nodes, languages = languages diff --git a/project-generator/src/main/kotlin/io/github/cdsap/projectgenerator/writer/ConventionPluginWriter.kt b/project-generator/src/main/kotlin/io/github/cdsap/projectgenerator/writer/ConventionPluginWriter.kt index 6d71cae7..38868979 100644 --- a/project-generator/src/main/kotlin/io/github/cdsap/projectgenerator/writer/ConventionPluginWriter.kt +++ b/project-generator/src/main/kotlin/io/github/cdsap/projectgenerator/writer/ConventionPluginWriter.kt @@ -35,7 +35,8 @@ class ConventionPluginWriter( File("${it.projectName}/build-logic/convention/build.gradle.kts").projectFile( CompositeBuildBuildGradle().get( versions, - requested + requested, + versions.di ) ) } @@ -59,8 +60,8 @@ class ConventionPluginWriter( } private fun createPluginAndroid(languages: List) { - val pluginAndroidLib = CompositeBuildPluginAndroidLib().get(versions) - val pluginAndroidApp = CompositeBuildPluginAndroidApp().get(versions) + val pluginAndroidLib = CompositeBuildPluginAndroidLib().get(versions, versions.di) + val pluginAndroidApp = CompositeBuildPluginAndroidApp().get(versions, versions.di) languages.forEach { File("${it.projectName}/build-logic/convention/src/main/kotlin/com/logic/CompositeBuildPluginAndroidApp.kt").projectFile( pluginAndroidApp @@ -80,4 +81,3 @@ class ConventionPluginWriter( } } } - diff --git a/project-generator/src/main/kotlin/io/github/cdsap/projectgenerator/writer/ProjectWriter.kt b/project-generator/src/main/kotlin/io/github/cdsap/projectgenerator/writer/ProjectWriter.kt index 93ad4ab0..561289e9 100644 --- a/project-generator/src/main/kotlin/io/github/cdsap/projectgenerator/writer/ProjectWriter.kt +++ b/project-generator/src/main/kotlin/io/github/cdsap/projectgenerator/writer/ProjectWriter.kt @@ -37,7 +37,8 @@ class ProjectWriter( languages, typeOfStringResources, generateUnitTest, - versions + versions, + versions.di ).write() TypeProjectRequested.JVM -> JvmModulesWriter(nodes, languages, generateUnitTest, versions).write() @@ -77,7 +78,7 @@ class ProjectWriter( languages: List ) { val plugins = if (typeOfProjectRequested == TypeProjectRequested.JVM) BuildGradle().getJvm(versions) - else BuildGradle().getAndroid(versions) + else BuildGradle().getAndroid(versions, versions.di) languages.forEach { File("${it.projectName}/build.${it.extension}").projectFile(plugins) } diff --git a/project-generator/src/test/kotlin/io/github/cdsap/projectgenerator/ProjectGeneratorE2EAgp9Test.kt b/project-generator/src/test/kotlin/io/github/cdsap/projectgenerator/ProjectGeneratorE2EAgp9Test.kt index d74714dd..e373af21 100644 --- a/project-generator/src/test/kotlin/io/github/cdsap/projectgenerator/ProjectGeneratorE2EAgp9Test.kt +++ b/project-generator/src/test/kotlin/io/github/cdsap/projectgenerator/ProjectGeneratorE2EAgp9Test.kt @@ -34,7 +34,7 @@ class ProjectGeneratorE2EAgp9Test { Language.KTS, TypeProjectRequested.ANDROID, ClassesPerModule(ClassesPerModuleType.FIXED, 20), - Versions(project = Project(jdk = "17"), android = Android(agp = "9.0.0-alpha14")), + Versions(project = Project(jdk = "17"), android = Android(agp = "9.0.0")), TypeOfStringResources.LARGE, 5, true, @@ -74,4 +74,3 @@ class ProjectGeneratorE2EAgp9Test { } } - diff --git a/project-generator/src/test/kotlin/io/github/cdsap/projectgenerator/ProjectGeneratorE2EJdk21Test.kt b/project-generator/src/test/kotlin/io/github/cdsap/projectgenerator/ProjectGeneratorE2EJdk21Test.kt index cad8bde6..3548ae83 100644 --- a/project-generator/src/test/kotlin/io/github/cdsap/projectgenerator/ProjectGeneratorE2EJdk21Test.kt +++ b/project-generator/src/test/kotlin/io/github/cdsap/projectgenerator/ProjectGeneratorE2EJdk21Test.kt @@ -71,4 +71,3 @@ class ProjectGeneratorE2EJdk21Test { } } - diff --git a/project-generator/src/test/kotlin/io/github/cdsap/projectgenerator/ProjectGeneratorE2ETest.kt b/project-generator/src/test/kotlin/io/github/cdsap/projectgenerator/ProjectGeneratorE2ETest.kt index 6332c774..28596ef8 100644 --- a/project-generator/src/test/kotlin/io/github/cdsap/projectgenerator/ProjectGeneratorE2ETest.kt +++ b/project-generator/src/test/kotlin/io/github/cdsap/projectgenerator/ProjectGeneratorE2ETest.kt @@ -147,4 +147,3 @@ class ProjectGeneratorE2ETest { assert(toml.readText().contains("agp = \"9.9.9\"")) } } - diff --git a/project-generator/src/test/kotlin/io/github/cdsap/projectgenerator/SingleE2EValidationTest.kt b/project-generator/src/test/kotlin/io/github/cdsap/projectgenerator/SingleE2EValidationTest.kt index 6ea4d4fe..afd5ad46 100644 --- a/project-generator/src/test/kotlin/io/github/cdsap/projectgenerator/SingleE2EValidationTest.kt +++ b/project-generator/src/test/kotlin/io/github/cdsap/projectgenerator/SingleE2EValidationTest.kt @@ -34,7 +34,7 @@ class SingleE2EValidationTest { language = Language.KTS, typeOfProjectRequested = TypeProjectRequested.ANDROID, classesPerModule = ClassesPerModule(ClassesPerModuleType.FIXED, 20), - versions = Versions(project = Project(jdk = "17"), android = Android(agp = "9.0.0-alpha14")), + versions = Versions(project = Project(jdk = "17"), android = Android(agp = "9.0.0")), typeOfStringResources = TypeOfStringResources.LARGE, layers = 5, generateUnitTest = true, diff --git a/project-generator/src/test/kotlin/io/github/cdsap/projectgenerator/writer/ConventionPluginWriterTest.kt b/project-generator/src/test/kotlin/io/github/cdsap/projectgenerator/writer/ConventionPluginWriterTest.kt index 798106ef..83f17bea 100644 --- a/project-generator/src/test/kotlin/io/github/cdsap/projectgenerator/writer/ConventionPluginWriterTest.kt +++ b/project-generator/src/test/kotlin/io/github/cdsap/projectgenerator/writer/ConventionPluginWriterTest.kt @@ -111,7 +111,7 @@ class ConventionPluginWriterTest { val buildGradleFile = File("$projectBasePath/build-logic/convention/build.gradle.kts") assertTrue(buildGradleFile.exists(), "build.gradle.kts missing for $projectBasePath") assertEquals( - CompositeBuildBuildGradle().get(versions, TypeProjectRequested.ANDROID).trim(), + CompositeBuildBuildGradle().get(versions, TypeProjectRequested.ANDROID, versions.di).trim(), buildGradleFile.readText().trim(), "build.gradle.kts content mismatch for $projectBasePath" ) @@ -127,7 +127,7 @@ class ConventionPluginWriterTest { val appPluginFile = File("$projectBasePath/build-logic/convention/src/main/kotlin/com/logic/CompositeBuildPluginAndroidApp.kt") assertTrue(appPluginFile.exists(), "App plugin missing for $projectBasePath") assertEquals( - CompositeBuildPluginAndroidApp().get(versions).trim(), + CompositeBuildPluginAndroidApp().get(versions, versions.di).trim(), appPluginFile.readText().trim(), "App plugin content mismatch for $projectBasePath" ) @@ -135,7 +135,7 @@ class ConventionPluginWriterTest { val libPluginFile = File("$projectBasePath/build-logic/convention/src/main/kotlin/com/logic/CompositeBuildPluginAndroidLib.kt") assertTrue(libPluginFile.exists(), "Lib plugin missing for $projectBasePath") assertEquals( - CompositeBuildPluginAndroidLib().get(versions).trim(), + CompositeBuildPluginAndroidLib().get(versions, versions.di).trim(), libPluginFile.readText().trim(), "Lib plugin content mismatch for $projectBasePath" ) @@ -148,7 +148,7 @@ class ConventionPluginWriterTest { val buildGradleFile = File("$projectBasePath/build-logic/convention/build.gradle.kts") assertTrue(buildGradleFile.exists(), "build.gradle.kts missing for $projectBasePath") assertEquals( - CompositeBuildBuildGradle().get(versions, TypeProjectRequested.JVM).trim(), + CompositeBuildBuildGradle().get(versions, TypeProjectRequested.JVM, versions.di).trim(), buildGradleFile.readText().trim(), "build.gradle.kts content mismatch for $projectBasePath" )