Ver Fonte

code improvements

milan jurkulák há 2 anos atrás
pai
commit
635e3c301a

+ 2 - 2
app/build.gradle.kts

@@ -14,8 +14,8 @@ appConfig {
     namespace = "org.mjdev.tvapp"
     description = "Smart TV android app for any android device"
 
-    createDocumentation = true // ok
-    createWebApp = true // todo, false does not affect
+    createDocumentation = true
+    createWebApp = true
     createWebSiteFromGit = false
 
     // todo

+ 18 - 15
buildSrc/src/main/kotlin/org/mjdev/gradle/extensions/ProjectExt.kt

@@ -38,6 +38,7 @@ import org.jetbrains.dokka.gradle.DokkaTask
 import org.jetbrains.kotlin.gradle.dsl.KotlinProjectExtension
 import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
 import org.mjdev.gradle.tasks.CreatePropsTask
+import org.mjdev.gradle.tasks.CleanProjectTask
 import org.kordamp.gradle.plugin.markdown.tasks.MarkdownToHtmlTask
 import org.mjdev.gradle.tasks.ReleaseNotesCreateTask
 import org.mjdev.gradle.tasks.WebServiceCreateTask
@@ -229,6 +230,7 @@ fun Project.loadBuildPropertiesFile(
     if (exposeToExtra) project.extra else null
 )
 
+@Suppress("UnusedReceiverParameter")
 fun Project.loadPropertiesFile(
     propertiesFile: File,
     exposeToExtra: ExtraPropertiesExtension?
@@ -236,6 +238,7 @@ fun Project.loadPropertiesFile(
     try {
         load(FileInputStream(propertiesFile))
     } catch (e: Exception) {
+        // ignored
     }
 }.apply {
     if (exposeToExtra != null) {
@@ -293,9 +296,24 @@ inline fun <reified T : Task> Project.task(scoped: T.() -> Unit = {}): T {
     return task
 }
 
+inline fun <reified T : Task> Project.task(
+    name: String,
+    scoped: T.() -> Unit = {}
+): T {
+    val task = tasks.named(name).get() as T
+    scoped(task)
+    return task
+}
+
 fun Project.kotlinCompileOptions(scoped: KotlinCompile.() -> Unit = {}) =
     task<KotlinCompile>(scoped)
 
+fun Project.cleanTask(scoped: Task.() -> Unit = {}) =
+    task(name = "clean", scoped = scoped)
+
+fun Project.cleanProjectTask(scoped: CleanProjectTask.() -> Unit = {}) =
+    task<CleanProjectTask>(scoped)
+
 fun Project.detektTask(scoped: Detekt.() -> Unit = {}) =
     task<Detekt>(scoped)
 
@@ -365,21 +383,6 @@ fun Project.fileTree(directory: String, inc: String, exc: String): List<File> {
     }.toList()
 }
 
-//inline fun <reified T> Project.runConfigured(crossinline function: T.() -> Unit) {
-//    afterEvaluate {
-//        val config = project.extension<T>()
-//        if (config is BuildConfigs) {
-//            project.androidExtension.buildTypes.forEach { bt ->
-//                println("> Configuring build : ${bt.name}")
-////                val btConfig = config.buildTypes[bt.name.lowercase()]
-////                println ("> Config: $btConfig")
-////                btConfig?.invoke(bt)
-//            }
-//        }
-//        function(config)
-//    }
-//}
-
 fun Project.androidComponents(
     block: AndroidComponentsExtension<*, *, *>.() -> Unit
 ) {

+ 15 - 13
buildSrc/src/main/kotlin/org/mjdev/gradle/extensions/TaskExt.kt

@@ -18,7 +18,6 @@ import io.gitlab.arturbosch.detekt.Detekt
 import org.gradle.StartParameter
 import org.gradle.api.GradleException
 import org.gradle.api.Plugin
-import org.gradle.api.Project
 import org.gradle.api.Task
 import org.gradle.api.file.ConfigurableFileCollection
 import org.gradle.api.logging.Logger
@@ -27,11 +26,10 @@ import org.gradle.api.plugins.AppliedPlugin
 import org.gradle.api.tasks.SourceSet.MAIN_SOURCE_SET_NAME
 import org.gradle.api.tasks.SourceSet.TEST_SOURCE_SET_NAME
 import org.gradle.api.tasks.TaskContainer
-import org.gradle.kotlin.dsl.withType
 import org.jetbrains.dokka.gradle.DokkaTask
 import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
 import org.mjdev.gradle.base.BaseTask
-import org.mjdev.gradle.plugin.config.base.BuildConfigs
+import org.mjdev.gradle.tasks.CleanProjectTask
 import java.io.File
 import kotlin.reflect.KClass
 
@@ -62,12 +60,6 @@ val Task.taskName: String
 val Task.tasks: TaskContainer
     get() = project.tasks
 
-val Task.cleanTask: Task
-    get() = tasks.byName<Task>("clean")
-
-val Task.tasksTask : Task
-    get() = tasks.byName<Task>("tasks")
-
 val Task.taskGroup: String
     get() = this.group.toString()
 
@@ -263,11 +255,15 @@ inline fun <reified T : Task> Task.shouldRunAfter() = tasks.forEach { task ->
 }
 
 fun Task.runAfterAssembleTask() {
-    project.assembleTasks.forEach { t -> t.finalizedBy(this) }
+    project.assembleTasks.forEach { t ->
+        t.finalizedBy(this)
+    }
+    mustRunAfter(assembleTasks)
 }
 
 fun Task.runAfterCleanTask() {
-    cleanTask.finalizedBy(this)
+    cleanTask().finalizedBy(this)
+    mustRunAfter(cleanTask())
 }
 
 inline fun <reified T : Task> TaskContainer.byName(name: String): T =
@@ -315,10 +311,16 @@ fun <T : Plugin<*>> Task.apply(type: KClass<T>): T =
 fun Task.kotlinCompileOptions(scoped: KotlinCompile.() -> Unit) =
     project.kotlinCompileOptions(scoped)
 
-fun Task.detektTask(scoped: Detekt.() -> Unit) =
+fun Task.cleanTask(scoped: Task.() -> Unit = {}) =
+    project.cleanTask(scoped)
+
+fun Task.cleanProjectTask(scoped: CleanProjectTask.() -> Unit = {}) =
+    project.cleanProjectTask(scoped)
+
+fun Task.detektTask(scoped: Detekt.() -> Unit = {}) =
     project.detektTask(scoped)
 
-fun Task.dokkaTask(scoped: DokkaTask.() -> Unit) =
+fun Task.dokkaTask(scoped: DokkaTask.() -> Unit = {}) =
     project.dokkaTask(scoped)
 
 fun Task.println(message: String) = this.log.lifecycle("> $message")

+ 11 - 12
buildSrc/src/main/kotlin/org/mjdev/gradle/plugin/AppPlugin.kt

@@ -24,7 +24,6 @@ import org.mjdev.gradle.base.BasePlugin
 import org.mjdev.gradle.extensions.addSyncProviderAuthString
 import org.mjdev.gradle.extensions.asInt
 import org.mjdev.gradle.extensions.registerTask
-import org.mjdev.gradle.extensions.runAfterCleanTask
 import org.mjdev.gradle.extensions.runAfterAssembleTask
 import org.mjdev.gradle.extensions.buildConfigString
 import org.mjdev.gradle.extensions.extension
@@ -54,8 +53,11 @@ import org.mjdev.gradle.plugin.config.AppConfig
 import org.mjdev.gradle.tasks.ReleaseNotesCreateTask
 import org.mjdev.gradle.tasks.WebServiceCreateTask
 import org.mjdev.gradle.tasks.CreatePropsTask
+import org.mjdev.gradle.tasks.CheckNewLibsTask
+import org.mjdev.gradle.tasks.CleanProjectTask
 import org.kordamp.gradle.plugin.markdown.MarkdownPlugin
 import org.mjdev.gradle.extensions.assembleTasks
+import org.mjdev.gradle.extensions.cleanProjectTask
 import org.mjdev.gradle.extensions.markDownToHtmlTask
 import org.mjdev.gradle.extensions.variants
 import org.mjdev.gradle.extensions.zipReleaseCreateTask
@@ -79,20 +81,18 @@ class AppPlugin : BasePlugin() {
         apply(MarkdownPlugin::class)
         apply(DetektPlugin::class)
         apply(KotlinterPlugin::class)
+        registerTask<CleanProjectTask>()
+        registerTask<CheckNewLibsTask>() {
+            mustRunAfter(cleanProjectTask())
+        }
         registerTask<CreatePropsTask> {
             propsFilePath = AppConfig.configPropertiesFile
             propsClass = AppConfig::class.java
-            runAfterCleanTask()
-        }
-        registerTask<ReleaseNotesCreateTask>() {
-            mustRunAfter(assembleTasks)
-        }
-        registerTask<WebServiceCreateTask>() {
-            mustRunAfter(assembleTasks)
-        }
-        registerTask<ZipReleaseCreateTask>() {
-            mustRunAfter(assembleTasks)
+            mustRunAfter(cleanProjectTask())
         }
+        registerTask<ReleaseNotesCreateTask>()
+        registerTask<WebServiceCreateTask>()
+        registerTask<ZipReleaseCreateTask>()
         configure<ApplicationExtension> {
             namespace = appConfig.namespace
             compileSdk = AppConfig.compileSdk
@@ -222,7 +222,6 @@ class AppPlugin : BasePlugin() {
                     noAndroidSdkLink.set(false)
                 }
                 if (appConfig.createDocumentation) {
-                    mustRunAfter(assembleTasks)
                     runAfterAssembleTask()
                 }
             }

+ 0 - 2
buildSrc/src/main/kotlin/org/mjdev/gradle/plugin/LibPlugin.kt

@@ -39,7 +39,6 @@ import org.mjdev.gradle.extensions.fromBuildPropertiesFile
 import org.mjdev.gradle.extensions.loadRootPropertiesFile
 import org.mjdev.gradle.extensions.projectName
 import org.mjdev.gradle.extensions.registerTask
-import org.mjdev.gradle.extensions.runAfterCleanTask
 import org.mjdev.gradle.tasks.CreatePropsTask
 
 @Suppress("UnstableApiUsage")
@@ -62,7 +61,6 @@ class LibPlugin : BasePlugin() {
         registerTask<CreatePropsTask> {
             propsFilePath = LibConfig.configPropertiesFile
             propsClass = LibConfig::class.java
-            runAfterCleanTask()
         }
         configure<LibraryExtension> {
             namespace = libConfig.namespace

+ 146 - 0
buildSrc/src/main/kotlin/org/mjdev/gradle/tasks/CheckNewLibsTask.kt

@@ -0,0 +1,146 @@
+/*
+ *  Copyright (c) Milan Jurkulák 2024.
+ *  Contact:
+ *  e: mimoccc@gmail.com
+ *  e: mj@mjdev.org
+ *  w: https://mjdev.org
+ */
+
+package org.mjdev.gradle.tasks
+
+import okhttp3.OkHttpClient
+import okhttp3.Request
+import org.gradle.api.tasks.Input
+import org.gradle.api.tasks.Optional
+import org.gradle.internal.impldep.org.tomlj.Toml
+import org.mjdev.gradle.base.BaseTask
+import org.mjdev.gradle.extensions.buildDirectory
+import org.mjdev.gradle.extensions.println
+import org.mjdev.gradle.extensions.writeToFile
+import org.xml.sax.InputSource
+import java.io.FileReader
+import java.io.StringReader
+import java.net.URI
+import javax.xml.parsers.DocumentBuilderFactory
+import javax.xml.xpath.XPathConstants
+import javax.xml.xpath.XPathExpression
+import javax.xml.xpath.XPathFactory
+
+open class CheckNewLibsTask : BaseTask() {
+
+    @Optional
+    @Input
+    var tomlFilePath = "gradle/libs.versions.toml"
+
+    @Optional
+    @Input
+    var reportFilePath = "dependencies.txt"
+
+    private val tomlFile
+        get() = project.buildDirectory.resolve(tomlFilePath)
+
+    private val reportFile
+        get() = project.buildDirectory.resolve(reportFilePath)
+
+    private val isTomlFileExists
+        get() = tomlFile.exists()
+
+    private val newLibs = mutableListOf<String>()
+    private val missingLibs = mutableListOf<String>()
+
+    private val repoURL = URI("https://repo1.maven.org")
+    private val toml by lazy {
+        FileReader(tomlFile).use { file ->
+            Toml.parse(file)
+        }
+    }
+
+    private val okHttpClient by lazy {
+        OkHttpClient.Builder()
+            .build()
+    }
+
+    private val dbf: DocumentBuilderFactory = DocumentBuilderFactory.newInstance()
+    private val xpathFactory: XPathFactory = XPathFactory.newInstance()
+    private val expression = "//metadata//versioning//release"
+    private val releasePath = xpathFactory.newXPath().compile(expression)
+
+    init {
+        group = "mjdev"
+        description = "This task configure properties in project."
+        outputs.upToDateWhen { false }
+    }
+
+    private fun getLatestVersion(
+        packageName: String?,
+        mavenTarget: URI?,
+        dbf: DocumentBuilderFactory,
+        releasePath: XPathExpression
+    ): String {
+        val (groupId, artifactId) = packageName?.split(":") ?: emptyList()
+        val path = "${groupId.replace(".", "/")}/$artifactId"
+        val request = Request.Builder()
+            .url("${mavenTarget}/maven2/$path/maven-metadata.xml")
+            .build()
+        val xmlString = okHttpClient.newCall(request).execute().let { response ->
+            if (response.code != 200) {
+                "Could not find value in Maven Central. Need to check manually."
+            } else {
+                response.body.string()
+            }
+        }
+        val db = dbf.newDocumentBuilder()
+        val document = db.parse(InputSource(StringReader(xmlString)))
+        return releasePath.evaluate(document, XPathConstants.STRING).toString()
+    }
+
+    private fun printInfo() {
+        StringBuilder().apply {
+            appendLine("New libs detected for project :${project.name} ")
+            newLibs.forEach { line ->  appendLine(line) }
+            println("Missing version.ref - Need to check manually")
+            missingLibs.forEach { line ->  appendLine(line) }
+        }.toString().writeToFile(reportFile)
+    }
+
+    override fun onClean() {
+        if (reportFile.exists()) {
+            reportFile.delete()
+        }
+    }
+
+    override fun onAssemble() {
+        if (isTomlFileExists) {
+            val versions = toml.getTable("versions")?.toMap()
+            val libraries = toml.getTable("libraries")
+            val (currentVersionRefs, missingVersions) = libraries?.keySet()?.associate {
+                val module = libraries.getString("$it.module")
+                val versionRef = libraries.getString("$it.version.ref")
+                module to versionRef
+            }?.entries?.partition { it.value != null }.let {
+                Pair(emptyList<Map.Entry<String, String>>(), emptyList<Map.Entry<String, String>>())
+            }
+            val currentVersions = currentVersionRefs.associate {
+                it.key to versions?.getValue(it.value)
+            }
+            val latestVersions = currentVersions.mapValues { (packageName, _) ->
+                getLatestVersion(
+                    packageName,
+                    repoURL,
+                    dbf,
+                    releasePath
+                )
+            }
+            currentVersions.toSortedMap().forEach { (packageName, currentVersion) ->
+                val latestVersion = latestVersions.getValue(packageName)
+                if (currentVersion != latestVersion) {
+                    newLibs.add("$packageName: $currentVersion -> $latestVersion")
+                }
+            }
+            if (missingVersions.isNotEmpty()) {
+                missingLibs.add(missingVersions.map { it.key }.sortedBy { it }.joinToString("\n"))
+            }
+            printInfo()
+        }
+    }
+}

+ 42 - 0
buildSrc/src/main/kotlin/org/mjdev/gradle/tasks/CleanProjectTask.kt

@@ -0,0 +1,42 @@
+/*
+ *  Copyright (c) Milan Jurkulák 2024.
+ *  Contact:
+ *  e: mimoccc@gmail.com
+ *  e: mj@mjdev.org
+ *  w: https://mjdev.org
+ */
+
+package org.mjdev.gradle.tasks
+
+import org.mjdev.gradle.base.BaseTask
+
+// todo : .gitignore
+open class CleanProjectTask : BaseTask() {
+
+    @Suppress("DEPRECATION")
+    private val files = mutableListOf(
+        project.rootDir.resolve("documentation"),
+        project.rootDir.resolve("reports"),
+        project.buildDir,
+    )
+
+    private fun doClean() {
+        files.forEach { file ->
+            if (file.exists()) {
+                file.listFiles()?.forEach { f ->
+                    if (f.isDirectory) {
+                        f.deleteRecursively()
+                    }
+                }
+            }
+        }
+    }
+
+    override fun onClean() {
+        doClean()
+    }
+
+    override fun onAssemble() {
+        doClean()
+    }
+}

+ 0 - 1
buildSrc/src/main/kotlin/org/mjdev/gradle/tasks/CreatePropsTask.kt

@@ -41,7 +41,6 @@ open class CreatePropsTask : BaseTask() {
     private fun printInfo() {
         println("---------------------------------------------------------------------")
         println("Configuration for project :${project.name} ")
-        println("class : $propsClass")
         println("file : $propsFile")
         println("---------------------------------------------------------------------")
         val props = Properties()

+ 2 - 1
documentation/release-notes-1.2.7.md

@@ -1,7 +1,8 @@
-** Release notes 1.0.0 - 1. 5. 2024, 23:08:08
+** Release notes 1.0.0 - 2. 5. 2024, 10:33:01
 
 * 01.05.2024
 
+* [milan jurkulák] : code improvements 
 * [milan jurkulák] : code improvements 
 
 * 30.04.2024

+ 0 - 0
reports/.nomedia


+ 4 - 0
tvlib/build.gradle.kts

@@ -13,4 +13,8 @@ plugins {
 libConfig {
     namespace = "org.mjdev.tvlib"
     description = "Smart TV android app lib for android applications running on any android device"
+
+    autoCorrectCode = true
+    createDocumentation = true
+    minify = false
 }