From fa0f3dc5e672f77fad92fb802673f95979732be5 Mon Sep 17 00:00:00 2001 From: "R. C. Howell" Date: Thu, 25 May 2023 15:20:03 -0700 Subject: [PATCH] Updates to publish plugin. Fixes javadoc (#146) --- buildSrc/build.gradle.kts | 22 +++- .../pig/gradle/publish/PigPublishPlugin.kt | 124 ++++++++++++++++++ .../src/main/kotlin/pig.publish.gradle.kts | 99 -------------- .../org.partiql.pig.gradle.publish.properties | 1 + pig-runtime/build.gradle.kts | 9 +- .../pig/tests/generated/DomainA.generated.kt | 6 - .../pig/tests/generated/DomainB.generated.kt | 7 - .../generated/MultiWordDomain.generated.kt | 11 -- .../tests/generated/PartiqlBasic.generated.kt | 4 - pig/build.gradle.kts | 22 +--- 10 files changed, 155 insertions(+), 150 deletions(-) create mode 100644 buildSrc/src/main/kotlin/org/partiql/pig/gradle/publish/PigPublishPlugin.kt delete mode 100644 buildSrc/src/main/kotlin/pig.publish.gradle.kts create mode 100644 buildSrc/src/main/resources/META-INF/gradle-plugins/org.partiql.pig.gradle.publish.properties diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts index 6158007..91efda3 100644 --- a/buildSrc/build.gradle.kts +++ b/buildSrc/build.gradle.kts @@ -15,16 +15,32 @@ plugins { `kotlin-dsl` + id("java-gradle-plugin") } repositories { gradlePluginPortal() } +object Versions { + const val detekt = "1.20.0-RC1" + const val dokka = "1.6.10" + const val kotlin = "1.5.+" + const val ktlint = "10.2.1" +} + +object Plugins { + const val detekt = "io.gitlab.arturbosch.detekt:detekt-gradle-plugin:${Versions.detekt}" + const val dokka = "org.jetbrains.dokka:dokka-gradle-plugin:${Versions.dokka}" + const val kotlinGradle = "org.jetbrains.kotlin:kotlin-gradle-plugin:${Versions.kotlin}" + const val ktlint = "org.jlleitschuh.gradle:ktlint-gradle:${Versions.ktlint}" +} + dependencies { - implementation("org.jetbrains.kotlin:kotlin-gradle-plugin:1.4.0") - implementation("org.jlleitschuh.gradle:ktlint-gradle:10.3.0") - implementation("org.jetbrains.dokka:dokka-gradle-plugin:1.4.0") + implementation(Plugins.detekt) + implementation(Plugins.dokka) + implementation(Plugins.kotlinGradle) + implementation(Plugins.ktlint) } allprojects { diff --git a/buildSrc/src/main/kotlin/org/partiql/pig/gradle/publish/PigPublishPlugin.kt b/buildSrc/src/main/kotlin/org/partiql/pig/gradle/publish/PigPublishPlugin.kt new file mode 100644 index 0000000..9fd4449 --- /dev/null +++ b/buildSrc/src/main/kotlin/org/partiql/pig/gradle/publish/PigPublishPlugin.kt @@ -0,0 +1,124 @@ +package org.partiql.pig.gradle.publish + +import org.gradle.api.Plugin +import org.gradle.api.Project +import org.gradle.api.plugins.JavaPlugin +import org.gradle.api.plugins.JavaPluginExtension +import org.gradle.api.publish.PublishingExtension +import org.gradle.api.publish.maven.MavenPublication +import org.gradle.api.publish.maven.plugins.MavenPublishPlugin +import org.gradle.api.publish.maven.tasks.PublishToMavenRepository +import org.gradle.jvm.tasks.Jar +import org.gradle.kotlin.dsl.create +import org.gradle.kotlin.dsl.get +import org.gradle.kotlin.dsl.getByName +import org.gradle.kotlin.dsl.provideDelegate +import org.gradle.plugins.signing.SigningExtension +import org.gradle.plugins.signing.SigningPlugin +import org.jetbrains.dokka.gradle.DokkaPlugin +import org.jetbrains.dokka.gradle.DokkaTask +import java.io.File + +/** + * Gradle plugin to consolidates the following publishing logic + * - Maven Publishing + * - Signing + * - SourcesJar + * - Dokka + JavadocJar + */ +abstract class PigPublishPlugin : Plugin { + + override fun apply(target: Project): Unit = with(target) { + pluginManager.apply(JavaPlugin::class.java) + pluginManager.apply(MavenPublishPlugin::class.java) + pluginManager.apply(SigningPlugin::class.java) + pluginManager.apply(DokkaPlugin::class.java) + val ext = extensions.create("publish", PublishExtension::class.java) + target.afterEvaluate { publish(ext) } + } + + private fun Project.publish(ext: PublishExtension) { + val releaseVersion = !version.toString().endsWith("-SNAPSHOT") + + // Run dokka unless the environment explicitly specifies false + val runDokka = (System.getenv()["DOKKA"] != "false") || releaseVersion + + // Include "sources" and "javadoc" in the JAR + extensions.getByType(JavaPluginExtension::class.java).run { + withSourcesJar() + withJavadocJar() + } + + tasks.getByName("dokkaHtml") { + onlyIf { runDokka } + outputDirectory.set(File("${buildDir}/javadoc")) + } + + // Add dokkaHtml output to the javadocJar + tasks.getByName("javadocJar") { + onlyIf { runDokka } + dependsOn(JavaPlugin.CLASSES_TASK_NAME) + archiveClassifier.set("javadoc") + from(tasks.named("dokkaHtml")) + } + + // Setup Maven Central Publishing + val publishing = extensions.getByType(PublishingExtension::class.java).apply { + publications { + create("maven") { + artifactId = ext.artifactId + from(components["java"]) + pom { + packaging = "jar" + name.set(ext.name) + description.set("The P.I.G. is a code generator for domain models such ASTs and execution plans.") + url.set("git@github.com:partiql/partiql-ir-generator.git") + scm { + connection.set("scm:git@github.com:partiql/partiql-ir-generator.git") + developerConnection.set("scm:git@github.com:partiql/partiql-ir-generator.git") + url.set("git@github.com:partiql/partiql-ir-generator.git") + } + licenses { + license { + name.set("The Apache License, Version 2.0") + url.set("http://www.apache.org/licenses/LICENSE-2.0.txt") + } + } + developers { + developer { + name.set("PartiQL Team") + email.set("partiql-dev@amazon.com") + organization.set("PartiQL") + organizationUrl.set("https://github.com/partiql") + } + } + } + } + } + repositories { + maven { + url = uri("https://aws.oss.sonatype.org/service/local/staging/deploy/maven2") + credentials { + val ossrhUsername: String by rootProject + val ossrhPassword: String by rootProject + username = ossrhUsername + password = ossrhPassword + } + } + } + } + + // Sign only if publishing to Maven Central + extensions.getByType(SigningExtension::class.java).run { + setRequired { + releaseVersion && gradle.taskGraph.allTasks.any { it is PublishToMavenRepository } + } + sign(publishing.publications["maven"]) + } + } +} + +abstract class PublishExtension { + var artifactId: String = "" + var name: String = "" +} diff --git a/buildSrc/src/main/kotlin/pig.publish.gradle.kts b/buildSrc/src/main/kotlin/pig.publish.gradle.kts deleted file mode 100644 index 6d81e32..0000000 --- a/buildSrc/src/main/kotlin/pig.publish.gradle.kts +++ /dev/null @@ -1,99 +0,0 @@ -import gradle.kotlin.dsl.accessors._4ba0e6f3f9855dd979d4ade2b5984a53.java - -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"). - * You may not use this file except in compliance with the License. - * A copy of the License is located at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * or in the "license" file accompanying this file. This file is distributed - * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either - * express or implied. See the License for the specific language governing - * permissions and limitations under the License. - */ - -plugins { - `maven-publish` - id("signing") - id("org.jetbrains.dokka") -} - -tasks.dokkaHtml.configure { - outputDirectory.set(buildDir.resolve("javadoc")) -} - -java { - withJavadocJar() - withSourcesJar() -} - -fun String.mavenName(): String = when (this) { - "pig-runtime" -> "PartiQL I.R. Generator (a.k.a P.I.G.) Runtime Library" - else -> "PartiQL I.R. Generator (a.k.a P.I.G.)" -} - -fun String.artifactId(): String = name.replace("pig", "partiql-ir-generator") - -publishing { - publications { - create(name) { - val module = name - artifactId = module.artifactId() - from(components["java"]) - pom { - url.set("https://partiql.org/") - packaging = "jar" - name.set(module.mavenName()) - description.set("The P.I.G. is a code generator for domain models such ASTs and execution plans.") - scm { - connection.set("scm:git@github.com:partiql/partiql-ir-generator.git") - developerConnection.set("scm:git@github.com:partiql/partiql-ir-generator.git") - url.set("git@github.com:partiql/partiql-ir-generator.git") - licenses { - license { - name.set("The Apache License, Version 2.0") - url.set("http://www.apache.org/licenses/LICENSE-2.0.txt") - } - } - developers { - developer { - name.set("PartiQL Team") - email.set("partiql-team@amazon.com") - organization.set("PartiQL") - organizationUrl.set("https://github.com/partiql") - } - } - } - } - } - repositories { - maven { - url = uri("https://aws.oss.sonatype.org/service/local/staging/deploy/maven2") - credentials { - val ossrhUsername: String by rootProject - val ossrhPassword: String by rootProject - username = ossrhUsername - password = ossrhPassword - } - } - } - } -} - -val isReleaseVersion = !rootProject.version.toString().endsWith("SNAPSHOT") - -signing { - sign(publishing.publications[name]) - isRequired = isReleaseVersion - // TODO figure out how to enable this - // && gradle.taskGraph.hasTask("publish") -} - -tasks.withType(Sign::class) { - onlyIf { - isReleaseVersion - } -} diff --git a/buildSrc/src/main/resources/META-INF/gradle-plugins/org.partiql.pig.gradle.publish.properties b/buildSrc/src/main/resources/META-INF/gradle-plugins/org.partiql.pig.gradle.publish.properties new file mode 100644 index 0000000..3f4950f --- /dev/null +++ b/buildSrc/src/main/resources/META-INF/gradle-plugins/org.partiql.pig.gradle.publish.properties @@ -0,0 +1 @@ +implementation-class=org.partiql.pig.gradle.publish.PigPublishPlugin diff --git a/pig-runtime/build.gradle.kts b/pig-runtime/build.gradle.kts index d189ec7..d450e16 100644 --- a/pig-runtime/build.gradle.kts +++ b/pig-runtime/build.gradle.kts @@ -15,11 +15,14 @@ plugins { id("pig.conventions") - id("pig.publish") + id("org.partiql.pig.gradle.publish") } -project.description = "The P.I.G. is a code generator for domain models such ASTs and execution plans." - dependencies { api("com.amazon.ion:ion-element:1.0.0") } + +publish { + artifactId = "pig-runtime" + name = "PartiQL I.R. Generator (a.k.a P.I.G.) Runtime Library" +} diff --git a/pig-tests/src/main/kotlin/org/partiql/pig/tests/generated/DomainA.generated.kt b/pig-tests/src/main/kotlin/org/partiql/pig/tests/generated/DomainA.generated.kt index 9b6cd57..8d1bbe0 100644 --- a/pig-tests/src/main/kotlin/org/partiql/pig/tests/generated/DomainA.generated.kt +++ b/pig-tests/src/main/kotlin/org/partiql/pig/tests/generated/DomainA.generated.kt @@ -1551,41 +1551,35 @@ class DomainA private constructor() { walkSymbolPrimitive(node.whatever) walkMetas(node.metas) } - open fun walkRecordToRemove(node: DomainA.RecordToRemove) { visitRecordToRemove(node) walkLongPrimitive(node.irrelevant) walkMetas(node.metas) } - open fun walkProductA(node: DomainA.ProductA) { visitProductA(node) walkLongPrimitive(node.one) walkProductToRemove(node.two) walkMetas(node.metas) } - open fun walkRecordA(node: DomainA.RecordA) { visitRecordA(node) walkLongPrimitive(node.one) walkProductToRemove(node.two) walkMetas(node.metas) } - open fun walkUnpermutedProduct(node: DomainA.UnpermutedProduct) { visitUnpermutedProduct(node) walkSymbolPrimitive(node.foo) walkLongPrimitive(node.bar) walkMetas(node.metas) } - open fun walkUnpermutedRecord(node: DomainA.UnpermutedRecord) { visitUnpermutedRecord(node) walkSymbolPrimitive(node.foo) walkLongPrimitive(node.bar) walkMetas(node.metas) } - ////////////////////////////////////// // Sum Type: SumToRemove ////////////////////////////////////// diff --git a/pig-tests/src/main/kotlin/org/partiql/pig/tests/generated/DomainB.generated.kt b/pig-tests/src/main/kotlin/org/partiql/pig/tests/generated/DomainB.generated.kt index e9e0c49..48a5b5c 100644 --- a/pig-tests/src/main/kotlin/org/partiql/pig/tests/generated/DomainB.generated.kt +++ b/pig-tests/src/main/kotlin/org/partiql/pig/tests/generated/DomainB.generated.kt @@ -1245,44 +1245,37 @@ class DomainB private constructor() { walkLongPrimitive(node.bar) walkMetas(node.metas) } - open fun walkUnpermutedRecord(node: DomainB.UnpermutedRecord) { visitUnpermutedRecord(node) walkSymbolPrimitive(node.foo) walkLongPrimitive(node.bar) walkMetas(node.metas) } - open fun walkProductA(node: DomainB.ProductA) { visitProductA(node) walkSymbolPrimitive(node.one) walkMetas(node.metas) } - open fun walkRecordA(node: DomainB.RecordA) { visitRecordA(node) walkSymbolPrimitive(node.one) walkMetas(node.metas) } - open fun walkSumToReplaceWithProduct(node: DomainB.SumToReplaceWithProduct) { visitSumToReplaceWithProduct(node) walkSymbolPrimitive(node.foo) walkMetas(node.metas) } - open fun walkNewProduct(node: DomainB.NewProduct) { visitNewProduct(node) walkLongPrimitive(node.foo) walkMetas(node.metas) } - open fun walkNewRecord(node: DomainB.NewRecord) { visitNewRecord(node) walkLongPrimitive(node.foo) walkMetas(node.metas) } - ////////////////////////////////////// // Sum Type: UnpermutedSum ////////////////////////////////////// diff --git a/pig-tests/src/main/kotlin/org/partiql/pig/tests/generated/MultiWordDomain.generated.kt b/pig-tests/src/main/kotlin/org/partiql/pig/tests/generated/MultiWordDomain.generated.kt index 554f894..60962f2 100644 --- a/pig-tests/src/main/kotlin/org/partiql/pig/tests/generated/MultiWordDomain.generated.kt +++ b/pig-tests/src/main/kotlin/org/partiql/pig/tests/generated/MultiWordDomain.generated.kt @@ -1505,39 +1505,33 @@ class MultiWordDomain private constructor() { visitAaaAaa(node) walkMetas(node.metas) } - open fun walkAaaAab(node: MultiWordDomain.AaaAab) { visitAaaAab(node) node.dField?.let { walkLongPrimitive(it) } walkMetas(node.metas) } - open fun walkAaaAac(node: MultiWordDomain.AaaAac) { visitAaaAac(node) node.dField?.let { walkLongPrimitive(it) } node.eField?.let { walkSymbolPrimitive(it) } walkMetas(node.metas) } - open fun walkAaaAad(node: MultiWordDomain.AaaAad) { visitAaaAad(node) node.dField.map { walkLongPrimitive(it) } walkMetas(node.metas) } - open fun walkAaaAae(node: MultiWordDomain.AaaAae) { visitAaaAae(node) node.dField.map { walkLongPrimitive(it) } walkMetas(node.metas) } - open fun walkAabAaa(node: MultiWordDomain.AabAaa) { visitAabAaa(node) walkLongPrimitive(node.bField) walkSymbolPrimitive(node.cField) walkMetas(node.metas) } - open fun walkAabAab(node: MultiWordDomain.AabAab) { visitAabAab(node) walkLongPrimitive(node.bField) @@ -1545,7 +1539,6 @@ class MultiWordDomain private constructor() { node.dField?.let { walkLongPrimitive(it) } walkMetas(node.metas) } - open fun walkAabAac(node: MultiWordDomain.AabAac) { visitAabAac(node) walkLongPrimitive(node.bField) @@ -1554,7 +1547,6 @@ class MultiWordDomain private constructor() { node.eField?.let { walkSymbolPrimitive(it) } walkMetas(node.metas) } - open fun walkAabAad(node: MultiWordDomain.AabAad) { visitAabAad(node) walkLongPrimitive(node.bField) @@ -1562,7 +1554,6 @@ class MultiWordDomain private constructor() { node.dField.map { walkLongPrimitive(it) } walkMetas(node.metas) } - open fun walkAabAae(node: MultiWordDomain.AabAae) { visitAabAae(node) walkLongPrimitive(node.bField) @@ -1570,14 +1561,12 @@ class MultiWordDomain private constructor() { node.dField.map { walkLongPrimitive(it) } walkMetas(node.metas) } - open fun walkRrr(node: MultiWordDomain.Rrr) { visitRrr(node) walkLongPrimitive(node.aField) walkLongPrimitive(node.bbbField) walkMetas(node.metas) } - ////////////////////////////////////// // Sum Type: SssTtt ////////////////////////////////////// diff --git a/pig-tests/src/main/kotlin/org/partiql/pig/tests/generated/PartiqlBasic.generated.kt b/pig-tests/src/main/kotlin/org/partiql/pig/tests/generated/PartiqlBasic.generated.kt index 8ff2d35..c6030be 100644 --- a/pig-tests/src/main/kotlin/org/partiql/pig/tests/generated/PartiqlBasic.generated.kt +++ b/pig-tests/src/main/kotlin/org/partiql/pig/tests/generated/PartiqlBasic.generated.kt @@ -3891,27 +3891,23 @@ class PartiqlBasic private constructor() { walkExpr(node.second) walkMetas(node.metas) } - open fun walkGroupByItem(node: PartiqlBasic.GroupByItem) { visitGroupByItem(node) walkExpr(node.value) node.asAlias?.let { walkSymbolPrimitive(it) } walkMetas(node.metas) } - open fun walkGroupByList(node: PartiqlBasic.GroupByList) { visitGroupByList(node) node.items.map { walkGroupByItem(it) } walkMetas(node.metas) } - open fun walkGroupBy(node: PartiqlBasic.GroupBy) { visitGroupBy(node) walkGroupByList(node.items) node.groupAsAlias?.let { walkSymbolPrimitive(it) } walkMetas(node.metas) } - ////////////////////////////////////// // Sum Type: Projection ////////////////////////////////////// diff --git a/pig/build.gradle.kts b/pig/build.gradle.kts index 6c83308..18ec282 100644 --- a/pig/build.gradle.kts +++ b/pig/build.gradle.kts @@ -18,10 +18,13 @@ import java.util.Properties plugins { id("application") id("pig.conventions") - id("pig.publish") + id("org.partiql.pig.gradle.publish") } -project.description = "The P.I.G. is a code generator for domain models such ASTs and execution plans." +publish { + artifactId = "pig" + name = "PartiQL I.R. Generator (a.k.a P.I.G.)" +} val propertiesDir = "$buildDir/properties" @@ -35,21 +38,6 @@ application { mainClass.set("org.partiql.pig.MainKt") } -tasks.jar { - manifest { - attributes["Main-Class"] = "org.partiql.pig.MainKt" - } - from( - configurations.compile.get().map { - if (it.isDirectory) { - it - } else { - zipTree(it) - } - } - ) -} - tasks.register("generateProperties") { doLast { val propertiesFile = file("$propertiesDir/pig.properties")