diff --git a/build.gradle.kts b/build.gradle.kts index 13e64c90eb..a2644e567d 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -18,13 +18,13 @@ import org.gradle.api.tasks.wrapper.Wrapper.DistributionType.ALL */ plugins { - kotlin("jvm") version("1.9.22") apply(false) + kotlin("jvm") version("1.9.23") apply(false) id("idea") id("eclipse") id("project-report") - id("org.jetbrains.dokka") version("1.9.10") - id("com.github.jk1.dependency-license-report") version("2.5") + id("org.jetbrains.dokka") version("1.9.20") + id("com.github.jk1.dependency-license-report") version("2.6") id("org.jetbrains.kotlinx.binary-compatibility-validator") version("0.14.0") id("org.graalvm.buildtools.native") version("0.10.1") apply(false) id("io.gitlab.arturbosch.detekt") version("1.23.5") apply(false) diff --git a/core/build.gradle.kts b/core/build.gradle.kts index 3fb54af627..4f0f233a5d 100644 --- a/core/build.gradle.kts +++ b/core/build.gradle.kts @@ -8,6 +8,7 @@ apply(from = "$rootDir/gradle/publish.gradle") apply(from = "$rootDir/gradle/dokka.gradle") apply(from = "$rootDir/gradle/native.gradle") apply(from = "$rootDir/gradle/detekt.gradle") +apply(from = "$rootDir/gradle/resources.gradle") description = "Hexagon core utilities. Includes logging helpers." diff --git a/gradle.properties b/gradle.properties index 1ddda872e5..77057ef27e 100644 --- a/gradle.properties +++ b/gradle.properties @@ -5,7 +5,7 @@ org.gradle.warning.mode=all org.gradle.console=plain # Gradle -version=3.5.0 +version=3.5.1 group=com.hexagonkt description=The atoms of your platform @@ -31,33 +31,33 @@ logoSmall=assets/img/logo.svg iconsDirectory=content # VERSIONS -kotlinVersion=1.9.22 -dokkaVersion=1.9.10 -mockkVersion=1.13.9 +kotlinVersion=1.9.23 +dokkaVersion=1.9.20 +mockkVersion=1.13.10 junitVersion=5.10.2 gatlingVersion=3.10.4 slf4jVersion=2.0.12 jmhVersion=1.37 -mkdocsMaterialVersion=9.5.11 +mkdocsMaterialVersion=9.5.13 mermaidDokkaVersion=0.6.0 nativeToolsVersion=0.10.1 # http_server_netty nettyVersion=4.1.107.Final -nettyTcNativeVersion=2.0.63.Final +nettyTcNativeVersion=2.0.65.Final # http_server_helidon -helidonVersion=4.0.5 +helidonVersion=4.0.6 # http_server_servlet servletVersion=6.0.0 -jettyVersion=12.0.6 +jettyVersion=12.0.7 # rest_tools swaggerRequestValidatorVersion=2.40.0 # serialization -jacksonVersion=2.16.1 +jacksonVersion=2.17.0 dslJsonVersion=2.0.2 # serverless_http_google diff --git a/gradle/kotlin.gradle b/gradle/kotlin.gradle index 061f8e9631..5ff2975bd5 100644 --- a/gradle/kotlin.gradle +++ b/gradle/kotlin.gradle @@ -35,40 +35,13 @@ repositories { } dependencies { - final String scriptJunitVersion = findProperty("junitVersion") ?: "5.10.1" + final String scriptJunitVersion = findProperty("junitVersion") ?: "5.10.2" implementation("org.jetbrains.kotlin:kotlin-stdlib") testImplementation("org.jetbrains.kotlin:kotlin-test") testImplementation("org.junit.jupiter:junit-jupiter:$scriptJunitVersion") -} - -// Replace build variables in resource files -processResources { - [ "properties", "ini", "cfg", "txt", "html", "xml", "json", "yaml", "svg" ].each { String ext -> - final Map projectStringProperties = project.getProperties() - .findAll { it.value instanceof String } - final Map rootStringProperties = rootProject.getProperties() - .findAll { it.value instanceof String } - - filesMatching("**/*.$ext") { - filter { - String content = it - - projectStringProperties.entrySet().forEach { entry -> - content = content.replace("\${project.${entry.key}}", entry.value.toString()) - } - - rootStringProperties.entrySet().forEach { entry -> - final String k = entry.key - final String v = entry.value.toString() - content = content.replace("\${rootProject.$k}", v.toString()) - } - - content - } - } - } + testRuntimeOnly("org.junit.platform:junit-platform-launcher") } tasks.withType(JavaCompile) { @@ -84,7 +57,7 @@ tasks.compileTestKotlin.kotlinOptions.jvmTarget = tasks.compileKotlin.kotlinOpti tasks.compileTestKotlin.kotlinOptions.apiVersion = tasks.compileKotlin.kotlinOptions.apiVersion clean { - delete("log", "out", ".vertx", "file-uploads", "kotlin-js-store") + delete("log", "out", ".vertx", "file-uploads", "kotlin-js-store", ".kotlin") delete( "$rootDir/build", "$rootDir/log", @@ -113,6 +86,8 @@ tasks.register("verify", Test) { shouldRunAfter(test) include("**/*IT.*") + testClassesDirs = testing.suites.test.sources.output.classesDirs + classpath = testing.suites.test.sources.runtimeClasspath } check.dependsOn("test", "verify") diff --git a/gradle/native.gradle b/gradle/native.gradle index bc616a059a..3c0cea3820 100644 --- a/gradle/native.gradle +++ b/gradle/native.gradle @@ -1,3 +1,6 @@ +/* + * Check usage information at: http://hexagonkt.com/gradle/#native + */ apply(plugin: "org.graalvm.buildtools.native") diff --git a/gradle/resources.gradle b/gradle/resources.gradle new file mode 100644 index 0000000000..b7c11243ba --- /dev/null +++ b/gradle/resources.gradle @@ -0,0 +1,33 @@ +/* + * Check usage information at: http://hexagonkt.com/gradle/#resources + */ + +apply(plugin: "java") + +// Replace build variables in resource files +processResources { + [ "properties", "ini", "cfg", "txt", "html", "xml", "json", "yaml", "svg" ].each { String ext -> + final Map projectStringProperties = project.getProperties() + .findAll { it.value instanceof String } + final Map rootStringProperties = rootProject.getProperties() + .findAll { it.value instanceof String } + + filesMatching("**/*.$ext") { + filter { + String content = it + + projectStringProperties.entrySet().forEach { entry -> + content = content.replace("\${project.${entry.key}}", entry.value.toString()) + } + + rootStringProperties.entrySet().forEach { entry -> + final String k = entry.key + final String v = entry.value.toString() + content = content.replace("\${rootProject.$k}", v.toString()) + } + + content + } + } + } +} diff --git a/http/http_server/api/http_server.api b/http/http_server/api/http_server.api index 4ddbc452cf..9b77380eb0 100644 --- a/http/http_server/api/http_server.api +++ b/http/http_server/api/http_server.api @@ -104,6 +104,7 @@ public final class com/hexagonkt/http/server/callbacks/DateCallback : kotlin/jvm public final class com/hexagonkt/http/server/callbacks/FileCallback : kotlin/jvm/functions/Function1 { public fun (Ljava/io/File;)V + public fun (Ljava/lang/String;)V public fun invoke (Lcom/hexagonkt/http/handlers/HttpContext;)Lcom/hexagonkt/http/handlers/HttpContext; public synthetic fun invoke (Ljava/lang/Object;)Ljava/lang/Object; } @@ -117,6 +118,7 @@ public final class com/hexagonkt/http/server/callbacks/LoggingCallback : kotlin/ } public final class com/hexagonkt/http/server/callbacks/UrlCallback : kotlin/jvm/functions/Function1 { + public fun (Ljava/lang/String;)V public fun (Ljava/net/URL;)V public fun invoke (Lcom/hexagonkt/http/handlers/HttpContext;)Lcom/hexagonkt/http/handlers/HttpContext; public synthetic fun invoke (Ljava/lang/Object;)Ljava/lang/Object; diff --git a/http/http_server/src/main/kotlin/com/hexagonkt/http/server/callbacks/FileCallback.kt b/http/http_server/src/main/kotlin/com/hexagonkt/http/server/callbacks/FileCallback.kt index f42f466fca..b1735fb9bd 100644 --- a/http/http_server/src/main/kotlin/com/hexagonkt/http/server/callbacks/FileCallback.kt +++ b/http/http_server/src/main/kotlin/com/hexagonkt/http/server/callbacks/FileCallback.kt @@ -18,6 +18,9 @@ import java.io.File * @param file Base file used to resolve paths passed on the request. */ class FileCallback(private val file: File) : (HttpContext) -> HttpContext { + + constructor(file: String) : this(File(file)) + private companion object { val logger: Logger = Logger(FileCallback::class) } diff --git a/http/http_server/src/main/kotlin/com/hexagonkt/http/server/callbacks/UrlCallback.kt b/http/http_server/src/main/kotlin/com/hexagonkt/http/server/callbacks/UrlCallback.kt index 167a56d5d6..7b09606d2c 100644 --- a/http/http_server/src/main/kotlin/com/hexagonkt/http/server/callbacks/UrlCallback.kt +++ b/http/http_server/src/main/kotlin/com/hexagonkt/http/server/callbacks/UrlCallback.kt @@ -10,6 +10,9 @@ import com.hexagonkt.http.handlers.HttpContext import java.net.URL class UrlCallback(private val url: URL) : (HttpContext) -> HttpContext { + + constructor(url: String) : this(urlOf(url)) + private companion object { val logger: Logger = Logger(UrlCallback::class) } diff --git a/http/http_server/src/test/kotlin/com/hexagonkt/http/server/callbacks/FileCallbackTest.kt b/http/http_server/src/test/kotlin/com/hexagonkt/http/server/callbacks/FileCallbackTest.kt index 015501ba99..6308785ecb 100644 --- a/http/http_server/src/test/kotlin/com/hexagonkt/http/server/callbacks/FileCallbackTest.kt +++ b/http/http_server/src/test/kotlin/com/hexagonkt/http/server/callbacks/FileCallbackTest.kt @@ -70,7 +70,7 @@ internal class FileCallbackTest { requestPath: String, pathPattern: String ): HttpResponsePort = - FileCallback(File(filePath))( + FileCallback(filePath)( HttpContext( request = HttpRequest(path = requestPath), predicate = HttpPredicate(pathPattern = TemplatePathPattern(pathPattern)), diff --git a/http/http_server/src/test/kotlin/com/hexagonkt/http/server/callbacks/UrlCallbackTest.kt b/http/http_server/src/test/kotlin/com/hexagonkt/http/server/callbacks/UrlCallbackTest.kt index fbce9e168f..23bb0f5d4c 100644 --- a/http/http_server/src/test/kotlin/com/hexagonkt/http/server/callbacks/UrlCallbackTest.kt +++ b/http/http_server/src/test/kotlin/com/hexagonkt/http/server/callbacks/UrlCallbackTest.kt @@ -70,7 +70,7 @@ internal class UrlCallbackTest { requestPath: String, pathPattern: String ): HttpResponsePort = - UrlCallback(urlOf(url))( + UrlCallback(url)( HttpContext( HttpCall(HttpRequest(path = requestPath)), HttpPredicate(pathPattern = TemplatePathPattern(pathPattern)) diff --git a/http/http_server_netty/build.gradle.kts b/http/http_server_netty/build.gradle.kts index 538f9763a1..0c2e5761cd 100644 --- a/http/http_server_netty/build.gradle.kts +++ b/http/http_server_netty/build.gradle.kts @@ -18,9 +18,7 @@ dependencies { "api"(project(":http:http_server")) "api"("io.netty:netty-codec-http2:$nettyVersion") { exclude(group = "org.slf4j") } - - if (System.getProperty("os.name").lowercase().contains("mac")) - "api"("io.netty:netty-tcnative:$nettyTcNativeVersion:osx-x86_64") + "api"("io.netty:netty-tcnative-boringssl-static:$nettyTcNativeVersion") "testImplementation"(project(":http:http_test")) "testImplementation"(project(":http:http_client_jetty_ws")) diff --git a/http/http_server_netty/src/test/kotlin/com/hexagonkt/http/server/netty/AdapterExamplesTest.kt b/http/http_server_netty/src/test/kotlin/com/hexagonkt/http/server/netty/AdapterExamplesTest.kt index 2d438f09b6..54c95f75a6 100644 --- a/http/http_server_netty/src/test/kotlin/com/hexagonkt/http/server/netty/AdapterExamplesTest.kt +++ b/http/http_server_netty/src/test/kotlin/com/hexagonkt/http/server/netty/AdapterExamplesTest.kt @@ -7,6 +7,7 @@ import com.hexagonkt.serialization.jackson.json.Json import com.hexagonkt.serialization.jackson.yaml.Yaml import org.junit.jupiter.api.condition.DisabledInNativeImage import org.junit.jupiter.api.condition.DisabledOnOs +import org.junit.jupiter.api.condition.OS.MAC import org.junit.jupiter.api.condition.OS.WINDOWS // TODO Assert context methods (request.method, request.protocol...) @@ -20,7 +21,7 @@ internal class AdapterBooksTest : BooksTest(clientAdapter, serverAdapter) internal class AdapterErrorsTest : ErrorsTest(clientAdapter, serverAdapter) internal class AdapterFiltersTest : FiltersTest(clientAdapter, serverAdapter) internal class AdapterClientTest : ClientTest(clientAdapter, serverAdapter, formats) -@DisabledOnOs(WINDOWS) // TODO Make this work on GitHub runners +@DisabledOnOs(WINDOWS, MAC) // TODO Make this work on GitHub runners internal class AdapterHttpsTest : HttpsTest(clientAdapter, serverAdapter) internal class AdapterZipTest : ZipTest(clientAdapter, serverAdapter) internal class AdapterCookiesTest : CookiesTest(clientAdapter, serverAdapter) @@ -44,7 +45,10 @@ val liteServerAdapter: () -> NettyServerAdapter = { internal class LiteAdapterBooksTest : BooksTest(clientAdapter, liteServerAdapter) internal class LiteAdapterErrorsTest : ErrorsTest(clientAdapter, liteServerAdapter) internal class LiteAdapterFiltersTest : FiltersTest(clientAdapter, liteServerAdapter) -@DisabledOnOs(WINDOWS) // TODO Make this work on GitHub runners +@DisabledOnOs(WINDOWS, MAC) // TODO Make this work on GitHub runners +//@DisabledIf( +// "java.lang.System.getProperty('os.name').toLowerCase().contains('mac') && !java.lang.System.getProperty('org.graalvm.nativeimage.imagecode').isBlank()" +//) internal class LiteAdapterHttpsTest : HttpsTest(clientAdapter, liteServerAdapter) internal class LiteAdapterZipTest : ZipTest(clientAdapter, liteServerAdapter) internal class LiteAdapterCookiesTest : CookiesTest(clientAdapter, liteServerAdapter) diff --git a/http/http_test/src/main/kotlin/com/hexagonkt/http/test/examples/ClientTest.kt b/http/http_test/src/main/kotlin/com/hexagonkt/http/test/examples/ClientTest.kt index 4ca3df6ba5..b9bbf37354 100644 --- a/http/http_test/src/main/kotlin/com/hexagonkt/http/test/examples/ClientTest.kt +++ b/http/http_test/src/main/kotlin/com/hexagonkt/http/test/examples/ClientTest.kt @@ -26,6 +26,7 @@ import com.hexagonkt.serialization.SerializationManager import com.hexagonkt.serialization.serialize import org.junit.jupiter.api.* import org.junit.jupiter.api.condition.DisabledOnOs +import org.junit.jupiter.api.condition.OS.MAC import org.junit.jupiter.api.condition.OS.WINDOWS import java.math.BigInteger @@ -387,7 +388,7 @@ abstract class ClientTest( } @Test - @DisabledOnOs(WINDOWS) // TODO Make this work on GitHub runners + @DisabledOnOs(WINDOWS, MAC) // TODO Make this work on GitHub runners fun `Request HTTPS example`() { val serverAdapter = serverAdapter() diff --git a/http/rest_tools/build.gradle.kts b/http/rest_tools/build.gradle.kts index f6872ec497..da8e308269 100644 --- a/http/rest_tools/build.gradle.kts +++ b/http/rest_tools/build.gradle.kts @@ -18,7 +18,10 @@ dependencies { "api"(project(":http:rest")) "api"(project(":http:http_server")) "api"(project(":http:http_client")) - "api"("com.atlassian.oai:swagger-request-validator-core:$swaggerRequestValidatorVersion") + "api"("com.atlassian.oai:swagger-request-validator-core:$swaggerRequestValidatorVersion") { + exclude(module = "commons-compress") + exclude(module = "commons-codec") + } "testImplementation"(project(":http:http_client_jetty")) "testImplementation"(project(":http:http_server_jetty")) diff --git a/site/pages/gradle.md b/site/pages/gradle.md index d999872f33..5eaaefc4a0 100644 --- a/site/pages/gradle.md +++ b/site/pages/gradle.md @@ -93,7 +93,6 @@ It sets up: - Java version - Repositories - Kotlin dependencies -- Resource processing (replacing build variables) - Cleaning (deleting runtime files as logs and dump files) - Tests run, handles properties, output, and mocks (test's output depends on Gradle logging level) - Set up coverage report @@ -265,3 +264,8 @@ plugins { To set up this script's parameters, check the [build variables section]. These helper settings are: * jmhVersion: JMH version to be used. If not specified a tested JMH version will be used. + +## Resources +Process project resources (replacing build variables) + +To use it, apply `$gradleScripts/resources.gradle` to the project's `build.gradle.kts` file.