All Downloads are FREE. Search and download functionalities are using the official Maven repository.

tech.skot.tools.gradle.PluginTools.kt Maven / Gradle / Ivy

package tech.skot.tools.gradle

import org.gradle.api.Plugin
import org.gradle.api.Project
import org.gradle.api.plugins.JavaPluginConvention
import org.gradle.api.tasks.Delete
import org.gradle.kotlin.dsl.*
import tech.skot.Versions

open class SKPluginToolsExtension {
    //    var startScreen: String? = null
//    var appPackage: String? = null
//    var baseActivity:String? = null
//    var featureModules:List = emptyList()
    var app: App? = null
}

data class App(
    val packageName: String,
    val startScreen: String,
    val rootState: String? = null,
    val baseActivity: String = ".android.BaseActivity",
    val feature: String? = null,
    //le fullname d'une variable globale donnant la classe de base
    val baseActivityVar: String? = null,
    val initializationPlans:List = emptyList(),
    val iOs:Boolean = false,
    val referenceIconsByVariant: Boolean = false,
    val ktlintOnGeneratedFiles:Boolean = true
)

data class FeatureModule(val packageName: String, val startScreen: String)

class PluginTools : Plugin {

    override fun apply(project: Project) {
        val extension = project.extensions.create("skot")
        project.plugins.apply("java-library")
        project.plugins.apply("kotlin")

        project.dependencies {
            dependencies(project)
        }

        val javaPluginConvention = project.convention.getPlugin(JavaPluginConvention::class.java)
        val sourceSet = javaPluginConvention.sourceSets["main"]


        val trueProjectDir = project.parent?.projectDir ?: project.rootDir
        project.task("skClearGenerated", type = Delete::class) {
            doLast {
                println("####### clearGenerated  $trueProjectDir ")
                println("####### clearGenerated  feature ${extension.app?.feature} ")
                extension.app?.feature?.let {
                    println("--------------- one feature to delete: $trueProjectDir/$it/generated")
                    trueProjectDir.toPath().resolve("$it/generated").toFile().deleteRecursively()
                }

            }
            group = "Skot"
            delete = setOf(
                "$trueProjectDir/viewcontract/generated",
                "$trueProjectDir/modelcontract/generated",
                "$trueProjectDir/androidApp/generated",
                "$trueProjectDir/model/generated",
                "$trueProjectDir/view/generated",
                "$trueProjectDir/viewmodel/generated",
            )
        }

//        project.task("skMigrateToAlpha30") {
//            doLast {
//                println("Skot version ${Versions.skot}")
//                val app = extension.app
//                if (app == null) {
//                    println("renseignez la configuration skot dans le build.gradle.kts du module skot .........")
//                } else {
//                    println("migrate .........")
//                    project.javaexec {
//                        main = "tech.skot.tools.generation.MigrateKt"
//                        classpath = sourceSet.runtimeClasspath
//                        args = listOf(
//                            app.packageName,
//                            app.startScreen,
//                            app.rootState.toString(),
//                            app.baseActivity ?: "null",
//                            (project.parent?.projectDir ?: project.rootDir).toPath().toString(),
//                            app.feature ?: "null",
//                            app.baseActivityVar ?: "null",
//                            app.initializationPlans.joinToString("_"),
//                        )
//                    }
//                }
//            }
//            dependsOn(project.tasks.getByName("compileKotlin"))
//            group = "Skot"
//
//        }

        project.task("skGenerate") {
            doLast {
                println("Skot version ${Versions.skot}")

                val app = extension.app
                if (app == null) {
                    println("rien à générer .........")
                } else {
                    println("génération .........")
                    project.javaexec {
                        main = "tech.skot.tools.generation.GenerateKt"
                        classpath = sourceSet.runtimeClasspath
                        args = listOf(
                            app.packageName,
                            app.startScreen,
                            app.rootState.toString(),
                            app.baseActivity ?: "null",
                            (project.parent?.projectDir ?: project.rootDir).toPath().toString(),
                            app.feature ?: "null",
                            app.baseActivityVar ?: "null",
                            if (app.initializationPlans.isEmpty()) {
                                "null"
                            } else {
                                app.initializationPlans.joinToString("_")
                            },
                            app.iOs.toString(),
                            app.referenceIconsByVariant.toString()
                        )
                    }

                    if (app.ktlintOnGeneratedFiles) {
                        println("ktLint ......")
                        val srcs = "**/generated/**/*.kt"
                        try {
                            project.javaexec {
                                workingDir = project.rootDir
                                main = "com.pinterest.ktlint.Main"
                                classpath = sourceSet.runtimeClasspath
                                args = listOf("-F", srcs, "--disabled_rules=parameter-list-wrapping")
                            }
                        }
                        catch (ex:Exception) {
                            println("@@@@@@@@@@@   erreur ktlint")
                            ex.printStackTrace()
                        }
                    }
                }


            }
            val compileTask = project.tasks.getByName("compileKotlin")
            dependsOn(compileTask)

            group = "Skot"

        }

    }


    private fun DependencyHandlerScope.dependencies(project: Project) {
        val parentProjectPath = project.parent?.path ?: ""

        this.add("implementation", project("$parentProjectPath:viewcontract"))
        this.add("implementation", project("$parentProjectPath:modelcontract"))
        this.add("api", "${Versions.group}:generator:${Versions.skot}")
        this.add("implementation", "com.pinterest:ktlint:0.43.2")
    }

}







© 2015 - 2025 Weber Informatics LLC | Privacy Policy