diff -r fef46dce2812 -r 831cffa9c991 buildSrc/src/main/kotlin/VersionAlignment.kt --- /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>() + +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 +) { + 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}") + } + } + } + +}