Skip to content

Fix maven central publishing #42

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 4 commits into from
Jun 4, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion buildSrc/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ dependencies {

implementation(libs.gradleNodePlugin)

implementation(libs.qoomonGitVersioning)
implementation(libs.gitVersioningPlugin)
}


Expand Down
33 changes: 33 additions & 0 deletions buildSrc/src/main/kotlin/buildsrc/config/gradle.kt
Original file line number Diff line number Diff line change
@@ -1,7 +1,15 @@
package buildsrc.config

import org.gradle.api.Action
import org.gradle.api.Project
import org.gradle.api.artifacts.repositories.PasswordCredentials
import org.gradle.api.file.ProjectLayout
import org.gradle.api.provider.Provider
import org.gradle.api.provider.ProviderFactory
import org.gradle.kotlin.dsl.findByType
import org.gradle.plugins.ide.idea.model.IdeaModule
import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension
import org.jetbrains.kotlin.gradle.targets.jvm.KotlinJvmTarget


/** exclude generated Gradle code, so it doesn't clog up search results */
Expand All @@ -21,3 +29,28 @@ fun IdeaModule.excludeGeneratedGradleDsl(layout: ProjectLayout) {
)
)
}


// https://github.com/gradle/gradle/issues/20925
fun ProviderFactory.credentialsAction(
repositoryName: String
): Provider<Action<PasswordCredentials>> = zip(
gradleProperty("${repositoryName}Username"),
gradleProperty("${repositoryName}Password"),
) { user, pass ->
Action<PasswordCredentials> {
username = user
password = pass
}
}


/** Logic from [KotlinJvmTarget.withJava] */
fun Project.isKotlinMultiplatformJavaEnabled(): Boolean {
val multiplatformExtension: KotlinMultiplatformExtension? =
extensions.findByType(KotlinMultiplatformExtension::class)

return multiplatformExtension?.targets
?.any { it is KotlinJvmTarget && it.withJavaEnabled }
?: false
}
35 changes: 31 additions & 4 deletions buildSrc/src/main/kotlin/buildsrc/config/publishing.kt
Original file line number Diff line number Diff line change
Expand Up @@ -2,26 +2,53 @@ package buildsrc.config

import org.gradle.api.Project
import org.gradle.api.publish.PublishingExtension
import org.gradle.api.publish.maven.MavenPublication
import org.gradle.kotlin.dsl.configure
import org.gradle.kotlin.dsl.getByType
import org.gradle.plugins.signing.SigningExtension


fun MavenPublication.createKxsTsGenPom(): Unit = pom {
name.set("Kotlinx Serialization Typescript Generator")
description.set("KxsTsGen creates TypeScript interfaces from Kotlinx Serialization @Serializable classes")
url.set("https://github.com/adamko-dev/kotlinx-serialization-typescript-generator")

licenses {
license {
name.set("The Apache License, Version 2.0")
url.set("https://www.apache.org/licenses/LICENSE-2.0.txt")
}
}

developers {
developer {
email.set("adam@adamko.dev")
}
}

scm {
connection.set("scm:git:git://github.com/adamko-dev/kotlinx-serialization-typescript-generator.git")
developerConnection.set("scm:git:ssh://github.com:adamko-dev/kotlinx-serialization-typescript-generator.git")
url.set("https://github.com/adamko-dev/kotlinx-serialization-typescript-generator")
}
}


// hacks because IntelliJ still doesn't properly load DSL accessors for buildSrc


/** Configure [PublishingExtension] */
fun Project.publishing(action: PublishingExtension.() -> Unit): Unit =
extensions.configure(action)
fun Project.publishing(configure: PublishingExtension.() -> Unit): Unit =
extensions.configure(configure)


val Project.publishing: PublishingExtension
get() = extensions.getByType<PublishingExtension>()


/** Configure [SigningExtension] */
fun Project.signing(action: SigningExtension.() -> Unit): Unit =
extensions.configure(action)
fun Project.signing(configure: SigningExtension.() -> Unit): Unit =
extensions.configure(configure)


val Project.signing: SigningExtension
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
package buildsrc.convention

import buildsrc.config.createKxsTsGenPom
import buildsrc.config.credentialsAction
import buildsrc.config.isKotlinMultiplatformJavaEnabled
import buildsrc.config.publishing
import buildsrc.config.signing
import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinMultiplatformPlugin
import org.jetbrains.kotlin.gradle.targets.jvm.KotlinJvmTarget


plugins {
Expand All @@ -13,15 +14,8 @@ plugins {
}

val sonatypeRepositoryCredentials: Provider<Action<PasswordCredentials>> =
providers.zip(
providers.gradleProperty("sonatypeRepositoryUsername"),
providers.gradleProperty("sonatypeRepositoryPassword"),
) { user, pass ->
Action<PasswordCredentials> {
username = user
password = pass
}
}
providers.credentialsAction("sonatypeRepository")


val sonatypeRepositoryReleaseUrl: Provider<String> = provider {
if (version.toString().endsWith("SNAPSHOT")) {
Expand Down Expand Up @@ -49,36 +43,36 @@ val javadocJarStub by tasks.registering(Jar::class) {
}


tasks.matching {
it.name.startsWith(PublishingPlugin.PUBLISH_LIFECYCLE_TASK_NAME)
&& it.group == PublishingPlugin.PUBLISH_TASK_GROUP
}.configureEach {
tasks.withType<AbstractPublishToMaven>().configureEach {
// Gradle warns about some signing tasks using publishing task outputs without explicit
// dependencies. I'm not going to go through them all and fix them, so here's a quick fix.
dependsOn(tasks.withType<Sign>())

if (sonatypeRepositoryCredentials.isPresent()) {
dependsOn(javadocJarStub)
}

doLast {
logger.lifecycle("[${this.name}] ${project.group}:${project.name}:${project.version}")
}
}


// Gradle warns about some signing tasks using publishing task outputs without explicit
// dependencies. I'm not going to go through them all and fix them, so here's a quick safety check.
tasks.matching { it.name.startsWith("publish") }.configureEach {
mustRunAfter(tasks.matching { it.name.startsWith("sign") })
}


publishing {
if (sonatypeRepositoryCredentials.isPresent()) {
repositories {
maven(sonatypeRepositoryReleaseUrl) {
name = "sonatype"
credentials(sonatypeRepositoryCredentials.get())
}
// publish to local dir, for testing
// maven {
// name = "maven-internal"
// url = uri(rootProject.layout.buildDirectory.dir("maven-internal"))
// }
}
publications.withType<MavenPublication>().configureEach {
createKxTsGenPom()
createKxsTsGenPom()
artifact(javadocJarStub)
}
}
Expand Down Expand Up @@ -124,40 +118,3 @@ plugins.withType(JavaPlatformPlugin::class).configureEach {
from(components["javaPlatform"])
}
}


fun MavenPublication.createKxTsGenPom(): Unit = pom {
name.set("Kotlinx Serialization Typescript Generator")
description.set("KxTsGen creates TypeScript interfaces from Kotlinx Serialization @Serializable classes")
url.set("https://github.com/adamko-dev/kotlinx-serialization-typescript-generator")

licenses {
license {
name.set("The Apache License, Version 2.0")
url.set("https://www.apache.org/licenses/LICENSE-2.0.txt")
}
}

developers {
developer {
email.set("adam@adamko.dev")
}
}

scm {
connection.set("scm:git:git://github.com/adamko-dev/kotlinx-serialization-typescript-generator.git")
developerConnection.set("scm:git:ssh://github.com:adamko-dev/kotlinx-serialization-typescript-generator.git")
url.set("https://github.com/adamko-dev/kotlinx-serialization-typescript-generator")
}
}


/** Logic from [KotlinJvmTarget.withJava] */
fun Project.isKotlinMultiplatformJavaEnabled(): Boolean {
val multiplatformExtension: KotlinMultiplatformExtension? =
extensions.findByType(KotlinMultiplatformExtension::class)

return multiplatformExtension?.targets
?.any { it is KotlinJvmTarget && it.withJavaEnabled }
?: false
}
2 changes: 1 addition & 1 deletion docs/tuples.md
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ In TypeScript, tuples are a compact format for data structures. They're like fix
that only contain the type. This is especially useful when using JSON, as including property names
means the messages are much larger.

Tuples are a bit difficult to create in Kotlinx Serialization, but KxTsGen includes
Tuples are a bit difficult to create in Kotlinx Serialization, but KxsTsGen includes
[TupleSerializer](../modules/kxs-ts-gen-core/src/commonMain/kotlin/dev/adamko/kxstsgen/core/experiments/tuple.kt)
which can help. It requires a name, an ordered list of elements, and a constructor for
deserializing.
Expand Down
9 changes: 6 additions & 3 deletions gradle/libs.versions.toml
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,7 @@ kotlinProcess = "1.3.1"
classgraph = "4.8.143"

gradleNodePlugin = "3.3.0"

qoomonGitVersioning = "6.1.2"
gitVersioningPlugin = "6.1.2"

[libraries]

Expand Down Expand Up @@ -55,6 +54,7 @@ kotlinProcess = { group = "com.github.pgreze", name = "kotlin-process", version.
kotlinCompileTesting = { group = "com.github.tschuchortdev", name = "kotlin-compile-testing", version.ref = "kotlinCompileTesting" }
kotlinCompileTesting-ksp = { group = "com.github.tschuchortdev", name = "kotlin-compile-testing-ksp", version.ref = "kotlinCompileTesting" }

## Kotest ##

kotest-bom = { group = "io.kotest", name = "kotest-bom", version.ref = "kotest" }
kotest-assertionsCore = { group = "io.kotest", name = "kotest-assertions-core" }
Expand All @@ -65,13 +65,16 @@ kotest-frameworkDatatest = { group = "io.kotest", name = "kotest-framework-datat
kotest-runnerJUnit5 = { group = "io.kotest", name = "kotest-runner-junit5" }
kotest-gradlePlugin = { group = "io.kotest", name = "kotest-framework-multiplatform-plugin-gradle", version.ref = "kotest" }

## Knit ##

kotlinx-knit = { group = "org.jetbrains.kotlinx", name = "kotlinx-knit", version.ref = "kotlinx-knit" }
kotlinx-knit-test = { group = "org.jetbrains.kotlinx", name = "kotlinx-knit-test", version.ref = "kotlinx-knit" }
kotlinx-knit-gradlePlugin = { group = "org.jetbrains.kotlinx", name = "kotlinx-knit", version.ref = "kotlinx-knit" }


qoomonGitVersioning = { group = "me.qoomon", name = "gradle-git-versioning-plugin", version.ref = "qoomonGitVersioning" }
### Gradle Plugins ###

gitVersioningPlugin = { group = "me.qoomon", name = "gradle-git-versioning-plugin", version.ref = "gitVersioningPlugin" }

[bundles]

Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package dev.adamko.kxstsgen

import dev.adamko.kxstsgen.core.TsDeclaration
import dev.adamko.kxstsgen.core.UnimplementedKxTsGenApi
import dev.adamko.kxstsgen.core.UnimplementedKxsTsGenApi
import dev.adamko.kxstsgen.core.util.MutableMapWithDefaultPut
import kotlin.jvm.JvmInline
import kotlin.reflect.KClass
Expand All @@ -25,9 +25,9 @@ import kotlinx.serialization.modules.SerializersModuleCollector
data class KxsTsConfig(
val indent: String = " ",
val declarationSeparator: String = "\n\n",
@UnimplementedKxTsGenApi
@UnimplementedKxsTsGenApi
val namespaceConfig: NamespaceConfig = NamespaceConfig.Disabled,
@UnimplementedKxTsGenApi
@UnimplementedKxsTsGenApi
val typeAliasTyping: TypeAliasTypingConfig = TypeAliasTypingConfig.None,
val serializersModule: SerializersModule = EmptySerializersModule,
) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ import kotlinx.serialization.descriptors.nullable
* or by setting hardcoded values in [serializerDescriptorOverrides] or [descriptorOverrides],
* or changed by overriding any converter.
*
* @param[config] General settings that affect how KxTsGen works
* @param[config] General settings that affect how KxsTsGen works
* @param[sourceCodeGenerator] Convert [TsElement]s to TypeScript source code
*/
open class KxsTsGenerator(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,4 +9,4 @@ package dev.adamko.kxstsgen.core
)
@RequiresOptIn(level = RequiresOptIn.Level.WARNING)
@MustBeDocumented
annotation class UnimplementedKxTsGenApi
annotation class UnimplementedKxsTsGenApi