import org.gradle.api.tasks.testing.logging.TestExceptionFormat import org.gradle.api.tasks.testing.logging.TestLogEvent import org.jetbrains.dokka.gradle.DokkaTask import org.jetbrains.kotlin.gradle.tasks.KotlinCompile import java.net.URI import java.net.http.HttpClient import java.net.http.HttpRequest import java.net.http.HttpResponse plugins { id("application") id("com.github.ben-manes.versions") version "0.44.0" id("io.gitlab.arturbosch.detekt") version "1.22.0" id("java-library") id("maven-publish") id("org.jetbrains.dokka") version "1.7.20" id("org.jetbrains.kotlin.jvm") version "1.8.0" id("org.jetbrains.kotlinx.kover") version "0.6.1" id("org.sonarqube") version "3.5.0.2730" id("signing") } description = "A simple defensive library to encode/decode URL components" group = "net.thauvin.erik" version = "1.0.1" val mavenName = "UrlEncoder" val deployDir = "deploy" val gitHub = "ethauvin/${rootProject.name}" val mavenUrl = "https://github.com/$gitHub" val publicationName = "mavenJava" val myClassName = "$group.${rootProject.name}.$mavenName" repositories { mavenCentral() maven { url = uri("https://oss.sonatype.org/content/repositories/snapshots") } } dependencies { // testImplementation("com.willowtreeapps.assertk:assertk-jvm:0.25") testImplementation("org.junit.jupiter:junit-jupiter:5.9.0") } base { archivesName.set(rootProject.name) } java { sourceCompatibility = JavaVersion.VERSION_11 targetCompatibility = JavaVersion.VERSION_11 withSourcesJar() } application { mainClass.set(myClassName) } sonarqube { properties { property("sonar.projectName", rootProject.name) property("sonar.projectKey", "ethauvin_${rootProject.name}") property("sonar.organization", "ethauvin-github") property("sonar.host.url", "https://sonarcloud.io") property("sonar.sourceEncoding", "UTF-8") property("sonar.coverage.jacoco.xmlReportPaths", "${project.buildDir}/reports/kover/xml/report.xml") } } val javadocJar by tasks.creating(Jar::class) { dependsOn(tasks.dokkaJavadoc) from(tasks.dokkaJavadoc) archiveClassifier.set("javadoc") } tasks { jar { manifest { attributes["Main-Class"] = myClassName } } val fatJar = register("fatJar") { group = "build" dependsOn.addAll(listOf("compileJava", "compileKotlin", "processResources")) archiveClassifier.set("all") duplicatesStrategy = DuplicatesStrategy.EXCLUDE manifest { attributes(mapOf("Main-Class" to application.mainClass)) } val sourcesMain = sourceSets.main.get() val contents = configurations.runtimeClasspath.get() .map { if (it.isDirectory) it else zipTree(it) } + sourcesMain.output from(contents) } build { dependsOn(fatJar) } withType().configureEach { kotlinOptions.jvmTarget = java.targetCompatibility.toString() } test { useJUnitPlatform() addTestListener(object : TestListener { override fun beforeTest(p0: TestDescriptor?) = Unit override fun beforeSuite(p0: TestDescriptor?) = Unit override fun afterTest(desc: TestDescriptor, result: TestResult) = Unit override fun afterSuite(desc: TestDescriptor, result: TestResult) { if (desc.parent == null) { val passed = result.successfulTestCount val failed = result.failedTestCount val skipped = result.skippedTestCount if (project.properties["testsBadgeApiKey"] != null) { val apiKey = project.properties["testsBadgeApiKey"] println(apiKey) val response: HttpResponse = HttpClient.newHttpClient() .send( HttpRequest.newBuilder() .uri( URI( "https://rife2.com/tests-badge/update/net.thauvin.erik/urlencoder?" + "apiKey=$apiKey&" + "passed=$passed&" + "failed=$failed&" + "skipped=$skipped" ) ) .POST(HttpRequest.BodyPublishers.noBody()) .build(), HttpResponse.BodyHandlers.ofString() ) println("RESPONSE: ${response.statusCode()}") println(response.body()) } } } }) } withType { testLogging { exceptionFormat = TestExceptionFormat.FULL events = setOf(TestLogEvent.PASSED, TestLogEvent.SKIPPED, TestLogEvent.FAILED) } } withType { destination = file("$projectDir/pom.xml") } clean { doLast { project.delete(fileTree(deployDir)) } } withType().configureEach { dokkaSourceSets { named("main") { moduleName.set("UrlEncoder API") } } } val copyToDeploy by registering(Copy::class) { from(configurations.runtimeClasspath) { exclude("annotations-*.jar") } from(jar) into(deployDir) } register("deploy") { description = "Copies all needed files to the $deployDir directory." group = PublishingPlugin.PUBLISH_TASK_GROUP dependsOn(clean, build, jar) outputs.dir(deployDir) inputs.files(copyToDeploy) mustRunAfter(clean) } "sonar" { dependsOn(koverReport) } } publishing { publications { create(publicationName) { from(components["java"]) artifactId = rootProject.name artifact(javadocJar) pom { name.set("$mavenName for Kotlin") description.set(project.description) url.set(mavenUrl) licenses { license { name.set("The Apache License, Version 2.0") url.set("http://www.apache.org/licenses/LICENSE-2.0.txt") } } developers { developer { id.set("gbevin") name.set("Geert Bevin") email.set("gbevin@uwyn.com") url.set("https://github.com/gbevin") } developer { id.set("ethauvin") name.set("Erik C. Thauvin") email.set("erik@thauvin.net") url.set("https://erik.thauvin.net/") } } scm { connection.set("scm:git://github.com/$gitHub.git") developerConnection.set("scm:git@github.com:$gitHub.git") url.set(mavenUrl) } issueManagement { system.set("GitHub") url.set("$mavenUrl/issues") } } } } repositories { maven { name = "ossrh" url = if (project.version.toString().contains("SNAPSHOT")) uri("https://oss.sonatype.org/content/repositories/snapshots/") else uri("https://oss.sonatype.org/service/local/staging/deploy/maven2/") credentials(PasswordCredentials::class) } } } signing { useGpgCmd() sign(publishing.publications[publicationName]) }