buildSrc/src/main/kotlin/VersionAlignment.kt
changeset 1 831cffa9c991
child 10 9aad34f43f71
equal deleted inserted replaced
0:fef46dce2812 1:831cffa9c991
       
     1 package com.geekorum.build
       
     2 
       
     3 import org.gradle.api.artifacts.ComponentMetadataContext
       
     4 import org.gradle.api.artifacts.ComponentMetadataRule
       
     5 import org.gradle.api.artifacts.Dependency
       
     6 import org.gradle.api.artifacts.dsl.ComponentMetadataHandler
       
     7 import org.gradle.api.artifacts.dsl.DependencyHandler
       
     8 
       
     9 private val componentsPlatform = mutableMapOf<ComponentMetadataHandler, MutableSet<String>>()
       
    10 
       
    11 fun DependencyHandler.createComponentsPlatforms() {
       
    12     components.apply {
       
    13         getOrCreatePlatform(DaggerPlatform)
       
    14     }
       
    15 }
       
    16 
       
    17 private fun ComponentMetadataHandler.getOrCreatePlatform(platformFactory: PlatformFactory): String {
       
    18     val componentsSet = componentsPlatform.getOrPut(this) { mutableSetOf() }
       
    19     if (!componentsSet.contains(platformFactory.platformName)) {
       
    20         componentsSet.add(platformFactory.createPlatform(this))
       
    21     }
       
    22     return platformFactory.platformName
       
    23 }
       
    24 
       
    25 internal class DaggerPlatform {
       
    26     companion object : PlatformFactory("com.google.dagger:dagger-platform",
       
    27         AlignmentRule::class.java)
       
    28 
       
    29     open class AlignmentRule : SameGroupAlignmentRule(platformName, "com.google.dagger")
       
    30 }
       
    31 
       
    32 fun DependencyHandler.enforcedDaggerPlatform(version: String): Dependency {
       
    33     return enforcedPlatform("${components.getOrCreatePlatform(DaggerPlatform)}:$version")
       
    34 }
       
    35 
       
    36 open class PlatformFactory(
       
    37     internal val platformName: String,
       
    38     private val alignmentRule: Class<out ComponentMetadataRule>
       
    39 ) {
       
    40     fun createPlatform(components: ComponentMetadataHandler): String {
       
    41         components.all(alignmentRule)
       
    42         return platformName
       
    43     }
       
    44 }
       
    45 
       
    46 internal open class SameGroupAlignmentRule(
       
    47     private val platformName: String,
       
    48     private val group: String
       
    49 ) : ComponentMetadataRule {
       
    50 
       
    51     override fun execute(ctx: ComponentMetadataContext) {
       
    52         ctx.details.run {
       
    53             if (id.group == group) {
       
    54                 belongsTo("$platformName:${id.version}")
       
    55             }
       
    56         }
       
    57     }
       
    58 
       
    59 }