Skip to content

Commit

Permalink
sync dependency versions with Dokka, so the Generator Worker has the …
Browse files Browse the repository at this point in the history
…same dependencies. (#154)
  • Loading branch information
aSemy authored Jan 28, 2024
1 parent 6655c18 commit 5fa7963
Show file tree
Hide file tree
Showing 11 changed files with 189 additions and 65 deletions.
4 changes: 4 additions & 0 deletions buildSrc/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,10 @@ dependencies {
implementation(libs.gradlePlugin.dokkatoo)
implementation(libs.gradlePlugin.gradlePublishPlugin)
implementation("org.jetbrains.kotlin:kotlin-serialization:$embeddedKotlinVersion")

implementation("org.tomlj:tomlj:1.1.1") {
because("parse Dokka's libs.version.toml, so Dokkatoo can use the same versions")
}
}

java {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
package buildsrc.conventions

import buildsrc.settings.DokkaSourceDownloaderSettings
import buildsrc.utils.asConsumer
import buildsrc.utils.asProvider
import buildsrc.utils.consumable
import buildsrc.utils.declarable
import buildsrc.utils.dropDirectories
import buildsrc.utils.resolvable
import org.gradle.api.attributes.Usage.USAGE_ATTRIBUTE
import org.gradle.kotlin.dsl.support.serviceOf

Expand All @@ -15,15 +16,24 @@ val dsdExt: DokkaSourceDownloaderSettings = extensions.create<DokkaSourceDownloa
DokkaSourceDownloaderSettings.EXTENSION_NAME
)

val kotlinDokkaSource by configurations.creating<Configuration> {
asConsumer()
val kotlinDokkaSource: Configuration by configurations.creating {
declarable()
attributes {
attribute(USAGE_ATTRIBUTE, objects.named("externals-dokka-src"))
}
}

val kotlinDokkaSourceElements by configurations.registering {
asProvider()
val kotlinDokkaSourceResolvable: Configuration by configurations.creating {
resolvable()
extendsFrom(kotlinDokkaSource)
attributes {
attribute(USAGE_ATTRIBUTE, objects.named("externals-dokka-src"))
}
}

val kotlinDokkaSourceConsumable: Configuration by configurations.creating {
consumable()
extendsFrom(kotlinDokkaSource)
attributes {
attribute(USAGE_ATTRIBUTE, objects.named("externals-dokka-src"))
}
Expand All @@ -42,7 +52,7 @@ val prepareDokkaSource by tasks.registering(Sync::class) {
val archives = serviceOf<ArchiveOperations>()

from(
kotlinDokkaSource.incoming
kotlinDokkaSourceResolvable.incoming
.artifacts
.resolvedArtifacts
.map { artifacts ->
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
package buildsrc.conventions

import buildsrc.utils.asConsumer
import buildsrc.utils.asProvider
import buildsrc.utils.consumable
import buildsrc.utils.declarable
import buildsrc.utils.resolvable

plugins {
id("buildsrc.conventions.base")
Expand All @@ -16,12 +17,19 @@ dependencies.attributesSchema {
}


val exampleProjects by configurations.registering {
asConsumer()
val exampleProjects: Configuration by configurations.creating {
declarable()
attributes { attribute(exampleProjectsAttribute, "dokka") }
}

val exampleProjectsElements by configurations.registering {
asProvider()
val exampleProjectsResolvable: Configuration by configurations.creating {
resolvable()
extendsFrom(exampleProjects)
attributes { attribute(exampleProjectsAttribute, "dokka") }
}

val exampleProjectsConsumable: Configuration by configurations.creating {
consumable()
extendsFrom(exampleProjects)
attributes { attribute(exampleProjectsAttribute, "dokka") }
}
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,8 @@ plugins.withType<MavenPublishPlugin>().all {
.publications
.withType<MavenPublication>().all publication@{
val publicationName = this@publication.name
val installTaskName = "publish${publicationName.uppercaseFirstChar()}PublicationToTestMavenRepo"
val installTaskName =
"publish${publicationName.uppercaseFirstChar()}PublicationToTestMavenRepo"

// Register a publication task for each publication.
// Use PublishToMavenLocal, because the PublishToMavenRepository task will *always* create
Expand Down Expand Up @@ -66,16 +67,29 @@ plugins.withType<MavenPublishPlugin>().all {
}


val testMavenPublication by configurations.registering {
asConsumer()
val testMavenPublication: Configuration by configurations.creating {
declarable()
attributes {
attribute(MavenPublishTestSettings.attribute, "testMavenRepo")
}
}

val testMavenPublicationElements by configurations.registering {
asProvider()
extendsFrom(testMavenPublication.get())
val testMavenPublicationResolvable: Configuration by configurations.creating {
resolvable()
extendsFrom(testMavenPublication)
attributes {
attribute(MavenPublishTestSettings.attribute, "testMavenRepo")
}
outgoing {
artifact(mavenPublishTestExtension.testMavenRepo) {
builtBy(publishToTestMavenRepo)
}
}
}

val testMavenPublicationConsumable: Configuration by configurations.creating {
consumable()
extendsFrom(testMavenPublication)
attributes {
attribute(MavenPublishTestSettings.attribute, "testMavenRepo")
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
package buildsrc.tasks

import javax.inject.Inject
import org.gradle.api.DefaultTask
import org.gradle.api.file.DirectoryProperty
import org.gradle.api.file.FileSystemOperations
import org.gradle.api.provider.MapProperty
import org.gradle.api.tasks.*
import org.gradle.api.tasks.PathSensitivity.NONE
import org.tomlj.Toml

@CacheableTask
abstract class GenerateDokkatooConstants @Inject constructor(
private val fs: FileSystemOperations
) : DefaultTask() {

@get:OutputDirectory
abstract val destinationDir: DirectoryProperty

@get:Input
abstract val properties: MapProperty<String, String>

@get:InputDirectory
@get:PathSensitive(NONE)
abstract val dokkaSource: DirectoryProperty

init {
group = project.name
}

@TaskAction
fun action() {
val properties = properties.get() + getDokkaDependencyVersions()

// prepare temp dir
fs.delete { delete(temporaryDir) }

// generate file
val vals = properties.entries
.sortedBy { it.key }
.joinToString("\n") { (k, v) ->
"""const val $k = "$v""""
}.prependIndent(" ")

temporaryDir.resolve("DokkatooConstants.kt").apply {
parentFile.mkdirs()
writeText(
"""
|package dev.adamko.dokkatoo.internal
|
|@DokkatooInternalApi
|object DokkatooConstants {
|$vals
|}
|
""".trimMargin()
)
}

// sync file to output dir
fs.sync {
from(temporaryDir) {
into("dev/adamko/dokkatoo/internal/")
}
into(destinationDir)
}
}

private fun getDokkaDependencyVersions(): Map<String, String> {
val dokkaSource = dokkaSource.get().asFile
val dokkaLibsFile = dokkaSource.resolve("gradle/libs.versions.toml")
if (!dokkaLibsFile.exists()) {
error("could not find libs.versions.toml in Dokka source")
} else {

val dokkaLibs = Toml.parse(dokkaLibsFile.toPath())
fun version(name: String): String =
dokkaLibs.getString("versions.$name")
?: error("missing version $name in Dokka's libs.versions.toml")

return mapOf(
"DOKKA_DEPENDENCY_VERSION_KOTLINX_HTML" to version("kotlinx-html"),
"DOKKA_DEPENDENCY_VERSION_KOTLINX_COROUTINES" to version("kotlinx-coroutines"),
"DOKKA_DEPENDENCY_VERSION_FREEMARKER" to version("freemarker"),
"DOKKA_DEPENDENCY_VERSION_JETBRAINS_MARKDOWN" to version("jetbrains-markdown"),
)
}
}
}
28 changes: 25 additions & 3 deletions buildSrc/src/main/kotlin/buildsrc/utils/gradle.kt
Original file line number Diff line number Diff line change
Expand Up @@ -17,14 +17,16 @@ import org.gradle.kotlin.dsl.*
* ```
* isCanBeResolved = false
* isCanBeConsumed = true
* isCanBeDeclared = false
* ```
*/
fun Configuration.asProvider(
fun Configuration.consumable(
visible: Boolean = true
) {
isVisible = visible
isCanBeResolved = false
isCanBeConsumed = true
isCanBeDeclared = false
}

/**
Expand All @@ -33,14 +35,34 @@ fun Configuration.asProvider(
* ```
* isCanBeResolved = true
* isCanBeConsumed = false
* isCanBeDeclared = false
* ```
* */
fun Configuration.asConsumer(
*/
fun Configuration.resolvable(
visible: Boolean = false
) {
isVisible = visible
isCanBeResolved = true
isCanBeConsumed = false
isCanBeDeclared = false
}

/**
* Mark this [Configuration] as one that will be used to declare dependencies.
*
* ```
* isCanBeResolved = false
* isCanBeConsumed = false
* isCanBeDeclared = true
* ```
*/
fun Configuration.declarable(
visible: Boolean = false
) {
isVisible = visible
isCanBeResolved = false
isCanBeConsumed = false
isCanBeDeclared = true
}


Expand Down
2 changes: 1 addition & 1 deletion examples/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ dokkaTemplateProjects {
)
}

configurations.exampleProjectsElements.configure {
configurations.exampleProjectsConsumable.configure {
outgoing {
artifact(projectDir) {
builtBy(tasks.updateDokkatooExamples)
Expand Down
6 changes: 3 additions & 3 deletions modules/dokkatoo-plugin-integration-tests/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -80,13 +80,13 @@ testing.suites {

// depend on the test-publication configuration, but not the test-maven repo dir
// (otherwise this task will never be up-to-date)
dependsOn(configurations.testMavenPublication)
dependsOn(configurations.testMavenPublicationResolvable)

// depend on example & integration-test projects setup
dependsOn(configurations.exampleProjects)
dependsOn(configurations.exampleProjectsResolvable)
dependsOn(tasks.updateDokkatooExamples)

val dokkatooExamplesDir = configurations.exampleProjects.map {
val dokkatooExamplesDir = configurations.exampleProjectsResolvable.map {
it.incoming.files.singleFile.absolutePath
}

Expand Down
44 changes: 11 additions & 33 deletions modules/dokkatoo-plugin/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
@file:Suppress("UnstableApiUsage") // jvm test suites & test report aggregation are incubating

import buildsrc.tasks.GenerateDokkatooConstants
import buildsrc.utils.buildDir_
import buildsrc.utils.skipTestFixturesPublications

Expand All @@ -16,6 +17,8 @@ plugins {
`jvm-test-suite`
`test-report-aggregation`
buildsrc.conventions.`maven-publish-test`

buildsrc.conventions.`dokka-source-downloader`
}

description = "Generates documentation for Kotlin projects (using Dokka)"
Expand Down Expand Up @@ -201,39 +204,10 @@ val dokkatooConstantsProperties = objects.mapProperty<String, String>().apply {
put("DOKKA_VERSION", libs.versions.kotlin.dokka)
}

val buildConfigFileContents: Provider<TextResource> =
dokkatooConstantsProperties.map { constants ->

val vals = constants.entries
.sortedBy { it.key }
.joinToString("\n") { (k, v) ->
"""const val $k = "$v""""
}.prependIndent(" ")

resources.text.fromString(
"""
|package dev.adamko.dokkatoo.internal
|
|@DokkatooInternalApi
|object DokkatooConstants {
|$vals
|}
|
""".trimMargin()
)
}

val generateDokkatooConstants by tasks.registering(Sync::class) {
group = project.name

val buildConfigFileContents = buildConfigFileContents

from(buildConfigFileContents) {
rename { "DokkatooConstants.kt" }
into("dev/adamko/dokkatoo/internal/")
}

into(layout.buildDirectory.dir("generated-source/main/kotlin/"))
val generateDokkatooConstants by tasks.registering(GenerateDokkatooConstants::class) {
properties = dokkatooConstantsProperties
destinationDir.set(layout.buildDirectory.dir("generated-source/main/kotlin/"))
dokkaSource.fileProvider(tasks.prepareDokkaSource.map { it.destinationDir })
}

kotlin.sourceSets.main {
Expand All @@ -253,3 +227,7 @@ dokkatoo {
}
}
}

dokkaSourceDownload {
dokkaVersion.set(libs.versions.kotlin.dokka)
}
8 changes: 4 additions & 4 deletions modules/dokkatoo-plugin/src/main/kotlin/DokkatooBasePlugin.kt
Original file line number Diff line number Diff line change
Expand Up @@ -150,10 +150,10 @@ constructor(

dokkatooExtension.versions {
jetbrainsDokka.convention(DokkatooConstants.DOKKA_VERSION)
jetbrainsMarkdown.convention("0.3.1")
freemarker.convention("2.3.31")
kotlinxHtml.convention("0.8.0")
kotlinxCoroutines.convention("1.6.4")
jetbrainsMarkdown.convention(DokkatooConstants.DOKKA_DEPENDENCY_VERSION_JETBRAINS_MARKDOWN)
freemarker.convention(DokkatooConstants.DOKKA_DEPENDENCY_VERSION_FREEMARKER)
kotlinxHtml.convention(DokkatooConstants.DOKKA_DEPENDENCY_VERSION_KOTLINX_HTML)
kotlinxCoroutines.convention(DokkatooConstants.DOKKA_DEPENDENCY_VERSION_KOTLINX_COROUTINES)
}

dokkatooExtension.dokkaGeneratorIsolation.convention(
Expand Down
Loading

0 comments on commit 5fa7963

Please sign in to comment.