--- /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}")
+ }
+ }
+ }
+
+}