buildSrc/src/main/kotlin/VersionAlignment.kt
changeset 1 831cffa9c991
child 10 9aad34f43f71
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildSrc/src/main/kotlin/VersionAlignment.kt	Fri May 08 21:33:19 2020 -0400
@@ -0,0 +1,59 @@
+package com.geekorum.build
+
+import org.gradle.api.artifacts.ComponentMetadataContext
+import org.gradle.api.artifacts.ComponentMetadataRule
+import org.gradle.api.artifacts.Dependency
+import org.gradle.api.artifacts.dsl.ComponentMetadataHandler
+import org.gradle.api.artifacts.dsl.DependencyHandler
+
+private val componentsPlatform = mutableMapOf<ComponentMetadataHandler, MutableSet<String>>()
+
+fun DependencyHandler.createComponentsPlatforms() {
+    components.apply {
+        getOrCreatePlatform(DaggerPlatform)
+    }
+}
+
+private fun ComponentMetadataHandler.getOrCreatePlatform(platformFactory: PlatformFactory): String {
+    val componentsSet = componentsPlatform.getOrPut(this) { mutableSetOf() }
+    if (!componentsSet.contains(platformFactory.platformName)) {
+        componentsSet.add(platformFactory.createPlatform(this))
+    }
+    return platformFactory.platformName
+}
+
+internal class DaggerPlatform {
+    companion object : PlatformFactory("com.google.dagger:dagger-platform",
+        AlignmentRule::class.java)
+
+    open class AlignmentRule : SameGroupAlignmentRule(platformName, "com.google.dagger")
+}
+
+fun DependencyHandler.enforcedDaggerPlatform(version: String): Dependency {
+    return enforcedPlatform("${components.getOrCreatePlatform(DaggerPlatform)}:$version")
+}
+
+open class PlatformFactory(
+    internal val platformName: String,
+    private val alignmentRule: Class<out ComponentMetadataRule>
+) {
+    fun createPlatform(components: ComponentMetadataHandler): String {
+        components.all(alignmentRule)
+        return platformName
+    }
+}
+
+internal open class SameGroupAlignmentRule(
+    private val platformName: String,
+    private val group: String
+) : ComponentMetadataRule {
+
+    override fun execute(ctx: ComponentMetadataContext) {
+        ctx.details.run {
+            if (id.group == group) {
+                belongsTo("$platformName:${id.version}")
+            }
+        }
+    }
+
+}