Browse Source

Added compose compiler version checker

Vadik Sirekanyan 2 năm trước cách đây
mục cha
commit
f1c6c1bda0

+ 24 - 1
src/main/kotlin/org/sirekanyan/versionchecker/VersionCheckerPlugin.kt

@@ -7,8 +7,12 @@ import org.gradle.api.artifacts.Dependency
 import org.gradle.api.artifacts.SelfResolvingDependency
 import org.gradle.api.artifacts.dsl.RepositoryHandler
 import org.gradle.kotlin.dsl.create
+import org.sirekanyan.versionchecker.composechecker.ComposeVersionChecker
+import org.sirekanyan.versionchecker.extensions.callMemberProperty
 import org.sirekanyan.versionchecker.extensions.getSettingsRepositories
 import org.sirekanyan.versionchecker.gradlechecker.GradleVersionChecker
+import org.sirekanyan.versionchecker.model.Version
+import org.sirekanyan.versionchecker.model.toVersion
 
 class VersionCheckerPlugin : Plugin<Project> {
 
@@ -18,7 +22,6 @@ class VersionCheckerPlugin : Plugin<Project> {
         extension = project.extensions.create("versionCheckerOptions")
         project.task("versionChecker") {
             doLast {
-                executeGradleVersionChecker(project)
                 executeVersionChecker(
                     project.rootProject.buildscript.repositories,
                     project.rootProject.buildscript.configurations,
@@ -31,6 +34,18 @@ class VersionCheckerPlugin : Plugin<Project> {
                         "implementation"
                     )
                 }
+                executeGradleVersionChecker(project)
+                project.extensions.findByName("android")
+                    ?.callMemberProperty("composeOptions")
+                    ?.callMemberProperty("kotlinCompilerExtensionVersion")
+                    ?.let { version: Any ->
+                        checkNotNull((version as? String)?.toVersion()) {
+                            "Cannot parse compose version: $version"
+                        }
+                    }
+                    ?.let { version: Version ->
+                        executeComposeVersionChecker(version)
+                    }
             }
         }
     }
@@ -44,6 +59,14 @@ class VersionCheckerPlugin : Plugin<Project> {
         }
     }
 
+    private fun executeComposeVersionChecker(current: Version) {
+        val checker = ComposeVersionChecker()
+        val max = checker.getMaxVersion()
+        if (current != max) {
+            println("compose $current => $max")
+        }
+    }
+
     private fun executeVersionChecker(
         repositoryHandler: RepositoryHandler,
         configurationContainer: ConfigurationContainer,

+ 30 - 0
src/main/kotlin/org/sirekanyan/versionchecker/composechecker/ComposeVersionChecker.kt

@@ -0,0 +1,30 @@
+package org.sirekanyan.versionchecker.composechecker
+
+import com.fasterxml.jackson.databind.DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES
+import com.fasterxml.jackson.dataformat.xml.XmlMapper
+import com.fasterxml.jackson.module.kotlin.registerKotlinModule
+import io.ktor.client.*
+import io.ktor.client.request.*
+import io.ktor.client.statement.*
+import kotlinx.coroutines.runBlocking
+import org.sirekanyan.versionchecker.model.Metadata
+import org.sirekanyan.versionchecker.model.Version
+
+private const val METADATA_URL =
+    "https://dl.google.com/android/maven2/androidx/compose/compiler/compiler/maven-metadata.xml"
+
+class ComposeVersionChecker {
+
+    private val httpClient = HttpClient()
+    private val xmlMapper = XmlMapper().configure(FAIL_ON_UNKNOWN_PROPERTIES, false).registerKotlinModule()
+
+    fun getMaxVersion(): Version =
+        getVersions().maxOrNull() ?: Version.ZERO
+
+    private fun getVersions(): List<Version> {
+        val content = runBlocking { httpClient.get(METADATA_URL).bodyAsText() }
+        val metadata = xmlMapper.readValue(content, Metadata::class.java)
+        return metadata.getAvailableVersions()
+    }
+
+}

+ 6 - 0
src/main/kotlin/org/sirekanyan/versionchecker/extensions/Any.kt

@@ -0,0 +1,6 @@
+package org.sirekanyan.versionchecker.extensions
+
+import kotlin.reflect.full.memberProperties
+
+fun Any.callMemberProperty(key: String): Any? =
+    this::class.memberProperties.find { it.name == key }?.call(this)