Skip to content
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

Add support for kotlin multiplatform #59

Merged
merged 2 commits into from
Mar 18, 2024
Merged
Show file tree
Hide file tree
Changes from 1 commit
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
28 changes: 7 additions & 21 deletions build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

plugins {
alias(libs.plugins.kotlinGradlePlugin) apply false
alias(libs.plugins.kotlinMultiplatform) apply false
alias(libs.plugins.kotlinBinaryCompatibilityPlugin) apply false
alias(libs.plugins.mavenPublishGradlePlugin) apply false
alias(libs.plugins.versionsGradlePlugin)
Expand All @@ -12,64 +13,49 @@ plugins {
}

repositories {
google()
mavenCentral()
gradlePluginPortal()
}

buildscript {
repositories {
google()
mavenCentral()
}
}

subprojects {
buildscript {
repositories {
google()
mavenCentral()
gradlePluginPortal()
}
}

repositories {
google()
mavenCentral()
}

apply(plugin = "java")
apply(plugin = "kotlin")
apply(plugin = rootProject.project.libs.plugins.kotlinBinaryCompatibilityPlugin.get().pluginId)
apply(plugin = rootProject.project.libs.plugins.mavenPublishGradlePlugin.get().pluginId)

configure<JavaPluginExtension> {
withSourcesJar()
withJavadocJar()
}

plugins.withId("com.vanniktech.maven.publish.base") {
val publishingExtension = extensions.getByType(PublishingExtension::class.java)
configure<com.vanniktech.maven.publish.MavenPublishBaseExtension> {
pomFromGradleProperties()
publishToMavenCentral(com.vanniktech.maven.publish.SonatypeHost.DEFAULT, true)
signAllPublications()
}

publishingExtension.publications.create<MavenPublication>("maven") {
from(components["java"])
}
}

apply(plugin = "version-catalog")

// Only apply if the project has the kotlin plugin added:
plugins.withType<KotlinPluginWrapper> {
val compileKotlin by tasks.getting(KotlinCompile::class) {
kotlinOptions {
jvmTarget = "11"
jvmTarget = "17"
allWarningsAsErrors = true
}
}
val compileTestKotlin by tasks.getting(KotlinCompile::class) {
kotlinOptions {
jvmTarget = "11"
jvmTarget = "17"
allWarningsAsErrors = true
}
}
Expand Down
19 changes: 12 additions & 7 deletions gradle/libs.versions.toml
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
[versions]
acinqSecp256 = "0.10.1"
acinqSecp256 = "0.15.0"
guava = "31.1-jre"
junit = "5.9.3"
kotest = "5.6.2"
kotest = "5.8.1"
# @pin
kotlin = "1.7.22"
kotlin = "1.9.23"
kotlinBinaryCompatibilityPlugin = "0.13.2"
kotlinCoroutines = "1.7.2"
kotlinLogging = "3.0.5"
Expand All @@ -17,34 +17,39 @@ versionCatalogUpdateGradlePlugin = "0.8.1"
versionsGradlePlugin = "0.47.0"

[libraries]
acinqSecp256k1 = { module = "fr.acinq.secp256k1:secp256k1-kmp", version.ref = "acinqSecp256" }
acinqSecp256k1JniJvm = { module = "fr.acinq.secp256k1:secp256k1-kmp-jni-jvm", version.ref = "acinqSecp256" }
acinqSecp256k1Jvm = { module = "fr.acinq.secp256k1:secp256k1-kmp-jvm", version.ref = "acinqSecp256" }
guava = { module = "com.google.guava:guava", version.ref = "guava" }
junitApi = { module = "org.junit.jupiter:junit-jupiter-api", version.ref = "junit" }
junitEngine = { module = "org.junit.jupiter:junit-jupiter-engine", version.ref = "junit" }
kotestAssertions = { module = "io.kotest:kotest-assertions-core", version.ref = "kotest" }
kotestJunitRunnerJvm = { module = "io.kotest:kotest-runner-junit5-jvm", version.ref = "kotest" }
kotestKmmEngine = { module = "io.kotest:kotest-framework-engine", version.ref = "kotest" }
kotestProperty = { module = "io.kotest:kotest-property", version.ref = "kotest" }
kotlinLoggingJvm = { module = "io.github.microutils:kotlin-logging-jvm", version.ref = "kotlinLogging" }
kotlinxCoroutines = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-core", version.ref = "kotlinCoroutines" }
moshi = { module = "com.squareup.moshi:moshi-kotlin", version.ref = "moshi" }
okHttp = { module = "com.squareup.okhttp3:okhttp", version.ref = "okHttp" }
okIo = { module = "com.squareup.okio:okio-jvm", version.ref = "okIo" }
okIo = { module = "com.squareup.okio:okio", version.ref = "okIo" }
slf4jSimple = { module = "org.slf4j:slf4j-simple", version.ref = "slf4j" }
turbine = "app.cash.turbine:turbine:1.0.0"
kotlin-test = { module = "org.jetbrains.kotlin:kotlin-test", version.ref = "kotlin" }

[bundles]
kotest = [
"kotestAssertions",
"kotestJunitRunnerJvm",
"kotestProperty",
"kotestAssertions",
"kotestJunitRunnerJvm",
"kotestProperty",
]

[plugins]
dokka = "org.jetbrains.dokka:1.8.20"
gradleDocker = "com.bmuschko.docker-remote-api:9.3.1"
kotlinBinaryCompatibilityPlugin = { id = "org.jetbrains.kotlinx.binary-compatibility-validator", version.ref = "kotlinBinaryCompatibilityPlugin" }
kotlinGradlePlugin = { id = "org.jetbrains.kotlin.jvm", version.ref = "kotlin" }
kotlinMultiplatform = { id = "org.jetbrains.kotlin.multiplatform", version.ref = "kotlin" }
kotestMultiplatform = { id = "io.kotest.multiplatform", version.ref = "kotest" }
mavenPublishGradlePlugin = { id = "com.vanniktech.maven.publish.base", version.ref = "mavenPublishGradlePlugin" }
versionCatalogUpdateGradlePlugin = { id = "nl.littlerobots.version-catalog-update", version.ref = "versionCatalogUpdateGradlePlugin" }
versionsGradlePlugin = { id = "com.github.ben-manes.versions", version.ref = "versionsGradlePlugin" }
75 changes: 75 additions & 0 deletions lib-test/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,6 +1,36 @@
import com.bmuschko.gradle.docker.tasks.container.DockerCreateContainer
import com.bmuschko.gradle.docker.tasks.container.DockerStartContainer
import com.bmuschko.gradle.docker.tasks.image.DockerBuildImage
import com.bmuschko.gradle.docker.tasks.image.Dockerfile
import org.jetbrains.dokka.gradle.DokkaTask
import java.net.ServerSocket
import java.net.URL

plugins {
id("java")
id("kotlin")
`java-library`
id("com.bmuschko.docker-remote-api") version "9.3.0"
}

configure<JavaPluginExtension> {
withSourcesJar()
withJavadocJar()
}

plugins.withId("com.vanniktech.maven.publish.base") {
val publishingExtension = extensions.getByType(PublishingExtension::class.java)
configure<com.vanniktech.maven.publish.MavenPublishBaseExtension> {
pomFromGradleProperties()
publishToMavenCentral(com.vanniktech.maven.publish.SonatypeHost.DEFAULT, true)
signAllPublications()
}

publishingExtension.publications.create<MavenPublication>("maven") {
from(components["java"])
}
}

dependencies {
implementation(project(":lib"))
implementation(libs.kotestProperty)
Expand All @@ -11,9 +41,17 @@ dependencies {
// JSON
implementation(libs.moshi)

// Curves
implementation(libs.acinqSecp256k1JniJvm)
implementation(libs.acinqSecp256k1Jvm)

// Basic test libraries:

testImplementation(libs.kotestAssertions)
testImplementation(libs.kotestJunitRunnerJvm)
testImplementation(libs.kotestProperty)
testImplementation(libs.turbine)
testRuntimeOnly(libs.slf4jSimple)
testRuntimeOnly(libs.junitEngine)

apply(plugin = libs.plugins.dokka.get().pluginId)
Expand All @@ -36,3 +74,40 @@ tasks.withType<DokkaTask>().configureEach {
}
}
}

val createDockerfile by tasks.creating(Dockerfile::class) {
from("scsibug/nostr-rs-relay:latest")
}

val buildImage by tasks.creating(DockerBuildImage::class) {
dependsOn(createDockerfile)
images.add("scsibug/nostr-rs-relay:latest")
}

val createContainer by tasks.creating(DockerCreateContainer::class) {
onlyIf { !relayIsRunning() }
dependsOn(buildImage)
targetImageId(buildImage.imageId)
containerName.set("nostr-relay")
hostConfig.portBindings.set(listOf("7707:8080"))
hostConfig.autoRemove.set(true)
}

val startContainer by tasks.creating(DockerStartContainer::class) {
onlyIf { !relayIsRunning() }
dependsOn(createContainer)
targetContainerId(createContainer.containerId)
}

tasks.withType<Test>().configureEach {
dependsOn(startContainer)
}

fun relayIsRunning() =
try {
val s = ServerSocket(7707)
s.close()
false
} catch (_: java.io.IOException) {
true
}
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ import okio.ByteString
import okio.ByteString.Companion.toByteString
import java.time.Instant
import java.time.temporal.ChronoUnit
import java.util.*
import java.util.UUID

object ArbPrimitive {

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,14 +20,10 @@ import app.cash.nostrino.crypto.PubKeyTest.Companion.arbPubKey
import app.cash.nostrino.message.relay.EventMessage
import app.cash.nostrino.message.relay.RelayMessage
import app.cash.nostrino.model.ArbEvent.arbEvent
import app.cash.nostrino.model.ArbEvent.arbEventMessage
import app.cash.nostrino.model.ArbEvent.arbRelayMessage
import app.cash.nostrino.model.ArbEvent.arbSubscriptionId
import app.cash.nostrino.model.Event
import app.cash.nostrino.model.Filter
import io.kotest.core.spec.style.StringSpec
import io.kotest.matchers.collections.shouldBeSameSizeAs
import io.kotest.matchers.collections.shouldContainAll
import io.kotest.matchers.collections.shouldContainExactly
import io.kotest.matchers.equals.shouldBeEqual
import io.kotest.matchers.shouldBe
Expand All @@ -37,8 +33,6 @@ import io.kotest.property.arbitrary.next
import io.kotest.property.checkAll
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.asFlow
import kotlinx.coroutines.flow.filterIsInstance
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.flow.toList

class RelaySetTest : StringSpec({
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@
package app.cash.nostrino.model

import app.cash.nostrino.crypto.SecKeyGenerator
import app.cash.nostrino.message.NostrMessageAdapter.Companion.moshi
import app.cash.nostrino.model.ArbEvent.arbEventContent
import app.cash.nostrino.model.ArbEvent.arbEventWithContent
import app.cash.nostrino.model.ArbEventContent.arbTextNote
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ import app.cash.nostrino.model.ArbEvent.arbEventMessage
import app.cash.nostrino.model.ArbEvent.arbNotice
import app.cash.nostrino.model.ArbEvent.arbRelayMessage
import app.cash.nostrino.model.ArbEvent.moshi
import app.cash.nostrino.model.Event
import io.kotest.core.spec.style.StringSpec
import io.kotest.matchers.shouldBe
import io.kotest.matchers.string.shouldStartWith
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@
package app.cash.nostrino.model

import app.cash.nostrino.crypto.ArbKeys.arbSecKey
import app.cash.nostrino.message.NostrMessageAdapter
import app.cash.nostrino.model.ArbEventContent.arbZapReceipt
import io.kotest.core.spec.style.StringSpec
import io.kotest.matchers.shouldBe
Expand Down
2 changes: 2 additions & 0 deletions lib/api/lib.api
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ public final class app/cash/nostrino/client/ConnectionState : java/lang/Enum {
public static final field Disconnected Lapp/cash/nostrino/client/ConnectionState;
public static final field Disconnecting Lapp/cash/nostrino/client/ConnectionState;
public static final field Failing Lapp/cash/nostrino/client/ConnectionState;
public static fun getEntries ()Lkotlin/enums/EnumEntries;
public static fun valueOf (Ljava/lang/String;)Lapp/cash/nostrino/client/ConnectionState;
public static fun values ()[Lapp/cash/nostrino/client/ConnectionState;
}
Expand Down Expand Up @@ -107,6 +108,7 @@ public final class app/cash/nostrino/crypto/Bech32Serde$Encoding : java/lang/Enu
public static final field Bech32m Lapp/cash/nostrino/crypto/Bech32Serde$Encoding;
public static final field Beck32WithoutChecksum Lapp/cash/nostrino/crypto/Bech32Serde$Encoding;
public final fun getConstant ()I
public static fun getEntries ()Lkotlin/enums/EnumEntries;
public static fun valueOf (Ljava/lang/String;)Lapp/cash/nostrino/crypto/Bech32Serde$Encoding;
public static fun values ()[Lapp/cash/nostrino/crypto/Bech32Serde$Encoding;
}
Expand Down
Loading
Loading