diff --git a/.github/workflows/gradle.yml b/.github/workflows/gradle.yml
index 87a9233..73fdfce 100644
--- a/.github/workflows/gradle.yml
+++ b/.github/workflows/gradle.yml
@@ -1,6 +1,6 @@
name: gradle-ci
-on: [ push, pull_request, workflow_dispatch ]
+on: [push, pull_request, workflow_dispatch]
jobs:
build:
@@ -15,14 +15,13 @@ jobs:
java-version: [ 11, 17, 19 ]
steps:
- - uses: actions/checkout@v3
+ - uses: actions/checkout@v2
with:
fetch-depth: 0
- name: Set up JDK ${{ matrix.java-version }}
- uses: actions/setup-java@v3
+ uses: actions/setup-java@v1
with:
- distribution: 'zulu'
java-version: ${{ matrix.java-version }}
- name: Grant execute permission for gradlew
@@ -30,20 +29,33 @@ jobs:
- name: Cache SonarCloud packages
if: matrix.java-version == env.SONAR_JDK
- uses: actions/cache@v3
+ uses: actions/cache@v1
with:
path: ~/.sonar/cache
key: ${{ runner.os }}-sonar
restore-keys: ${{ runner.os }}-sonar
- - name: Test with Gradle
- uses: gradle/gradle-build-action@v2
+ - name: Cache Gradle packages
+ uses: actions/cache@v2
with:
- arguments: build check --stacktrace -PtestsBadgeApiKey=${{ secrets.TESTS_BADGE_API_KEY }}
+ path: |
+ ~/.gradle/caches
+ ~/.gradle/wrapper
+ key: ${{ runner.os }}-gradle-${{ matrix.java-version }}-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
+ restore-keys: |
+ ${{ runner.os }}-gradle-${{ matrix.java-version }}-
+
+ - name: Test with Gradle
+ run: ./gradlew build check --stacktrace -PtestsBadgeApiKey=${{ secrets.TESTS_BADGE_API_KEY }}
- name: SonarCloud
if: success() && matrix.java-version == env.SONAR_JDK
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
- run: ./gradlew sonar --info
+ run: ./gradlew sonar
+
+ - name: Cleanup Gradle Cache
+ run: |
+ rm -f ~/.gradle/caches/modules-2/modules-2.lock
+ rm -f ~/.gradle/caches/modules-2/gc.properties
diff --git a/.gitignore b/.gitignore
index 6e5d032..13a066e 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,73 +1,85 @@
-### Gradle ###
-.gradle
-build/
-deploy/
-gradle.properties
-
-### Kotlin/JVM ###
+!.vscode/extensions.json
+!.vscode/launch.json
+!.vscode/settings.json
+!.vscode/tasks.json
*.class
+*.code-workspace
+*.ctxt
+*.iws
*.log
-
-hs_err_pid*
-replay_pid*
-*.hprof
-
-*.jar
-*.war
*.nar
-*.ear
-*.zip
-*.tar.gz
*.rar
-
-
-### IntelliJ ###
-.idea/**/*
-
-### Eclipse ###
-.metadata
-bin/
-tmp/
-*.tmp
-*.bak
-*.swp
-*~.nib
-.settings/
-.loadpath
-.recommenders
-.classpath
-
-.apt_generated/
-.apt_generated_test/
-.project
-
-
-### Linux ###
-*~
-.fuse_hidden*
-.Trash-*
-.nfs*
-
-
-### Windows ###
-[Dd]esktop.ini
-$RECYCLE.BIN/
-*.lnk
-
-
-### macOS ###
+*.sublime-*
+*.tar.gz
+*.zip
.DS_Store
-._*
-
-# Icon must end with two \r
-Icon
-
-
-###########################
-
-# place overrides last, so they're not themselves overridden
-
-!gradle/wrapper/gradle-wrapper.jar
-!gradle/wrapper/gradle-wrapper.properties
-
-!.idea/copyright/**
+.classpath
+.gradle
+.history
+.kobalt
+.mtj.tmp/
+.mvn/timing.properties
+.mvn/wrapper/maven-wrapper.jar
+.nb-gradle
+.project
+.scannerwork
+.settings
+.vscode/*
+/**/.idea/$CACHE_FILE$
+/**/.idea/$PRODUCT_WORKSPACE_FILE$
+/**/.idea/**/caches/build_file_checksums.ser
+/**/.idea/**/contentModel.xml
+/**/.idea/**/dataSources.ids
+/**/.idea/**/dataSources.local.xml
+/**/.idea/**/dataSources/
+/**/.idea/**/dbnavigator.xml
+/**/.idea/**/dictionaries
+/**/.idea/**/dynamic.xml
+/**/.idea/**/gradle.xml
+/**/.idea/**/httpRequests
+/**/.idea/**/libraries
+/**/.idea/**/mongoSettings.xml
+/**/.idea/**/replstate.xml
+/**/.idea/**/shelf
+/**/.idea/**/shelf/
+/**/.idea/**/sqlDataSources.xml
+/**/.idea/**/tasks.xml
+/**/.idea/**/uiDesigner.xml
+/**/.idea/**/usage.statistics.xml
+/**/.idea/**/workspace.xml
+/**/.idea/sonarlint*
+/**/.idea_modules/
+Thumbs.db
+__pycache__
+atlassian-ide-plugin.xml
+bin/
+build/
+cmake-build-*/
+com_crashlytics_export_strings.xml
+crashlytics-build.properties
+crashlytics.properties
+dependency-reduced-pom.xml
+deploy/
+dist/
+ehthumbs.db
+fabric.properties
+gen/
+gradle.properties
+hs_err_pid*
+kobaltBuild
+kobaltw*-test
+lib/kotlin*
+libs/
+local.properties
+out/
+pom.xml.asc
+pom.xml.next
+pom.xml.releaseBackup
+pom.xml.tag
+pom.xml.versionsBackup
+proguard-project.txt
+project.properties
+release.properties
+target/
+test-output
+venv
diff --git a/.idea/.gitignore b/.idea/.gitignore
new file mode 100644
index 0000000..26d3352
--- /dev/null
+++ b/.idea/.gitignore
@@ -0,0 +1,3 @@
+# Default ignored files
+/shelf/
+/workspace.xml
diff --git a/.idea/compiler.xml b/.idea/compiler.xml
new file mode 100644
index 0000000..fb7f4a8
--- /dev/null
+++ b/.idea/compiler.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml
new file mode 100644
index 0000000..1e01b48
--- /dev/null
+++ b/.idea/inspectionProfiles/Project_Default.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml
new file mode 100644
index 0000000..cfd3ca8
--- /dev/null
+++ b/.idea/jarRepositories.xml
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/kotlinc.xml b/.idea/kotlinc.xml
new file mode 100644
index 0000000..2b8a50f
--- /dev/null
+++ b/.idea/kotlinc.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
new file mode 100644
index 0000000..2540c68
--- /dev/null
+++ b/.idea/misc.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/vcs.xml b/.idea/vcs.xml
new file mode 100644
index 0000000..35eb1dd
--- /dev/null
+++ b/.idea/vcs.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/build.gradle.kts b/build.gradle.kts
deleted file mode 100644
index 9eae0de..0000000
--- a/build.gradle.kts
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright 2001-2023 Geert Bevin (gbevin[remove] at uwyn dot com)
- * Copyright 2022-2023 Erik C. Thauvin (erik@thauvin.net)
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License 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 {
- buildsrc.conventions.base
-}
-
-group = "net.thauvin.erik"
-version = "1.4.0-SNAPSHOT"
diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts
deleted file mode 100644
index 15293cb..0000000
--- a/buildSrc/build.gradle.kts
+++ /dev/null
@@ -1,12 +0,0 @@
-plugins {
- `kotlin-dsl`
-}
-
-dependencies {
- implementation("com.github.ben-manes:gradle-versions-plugin:0.44.0")
- implementation("io.gitlab.arturbosch.detekt:detekt-gradle-plugin:1.22.0")
- implementation("org.jetbrains.dokka:dokka-gradle-plugin:1.8.10")
- implementation("org.jetbrains.kotlin:kotlin-gradle-plugin:1.8.21")
- implementation("org.jetbrains.kotlinx:kover-gradle-plugin:0.7.0")
- implementation("org.sonarsource.scanner.gradle:sonarqube-gradle-plugin:3.5.0.2730")
-}
diff --git a/buildSrc/settings.gradle.kts b/buildSrc/settings.gradle.kts
deleted file mode 100644
index bf6ac65..0000000
--- a/buildSrc/settings.gradle.kts
+++ /dev/null
@@ -1,16 +0,0 @@
-rootProject.name = "buildSrc"
-
-pluginManagement {
- repositories {
- mavenCentral()
- gradlePluginPortal()
- }
-}
-
-@Suppress("UnstableApiUsage")
-dependencyResolutionManagement {
- repositories {
- mavenCentral()
- gradlePluginPortal()
- }
-}
diff --git a/buildSrc/src/main/kotlin/buildsrc/conventions/base.gradle.kts b/buildSrc/src/main/kotlin/buildsrc/conventions/base.gradle.kts
deleted file mode 100644
index 59e3a56..0000000
--- a/buildSrc/src/main/kotlin/buildsrc/conventions/base.gradle.kts
+++ /dev/null
@@ -1,18 +0,0 @@
-package buildsrc.conventions
-
-/** common config for all subprojects */
-
-plugins {
- base
-}
-
-if (project != rootProject) {
- project.version = rootProject.version
- project.group = rootProject.group
-}
-
-tasks.withType().configureEach {
- // https://docs.gradle.org/current/userguide/working_with_files.html#sec:reproducible_archives
- isPreserveFileTimestamps = false
- isReproducibleFileOrder = true
-}
diff --git a/buildSrc/src/main/kotlin/buildsrc/conventions/code-quality.gradle.kts b/buildSrc/src/main/kotlin/buildsrc/conventions/code-quality.gradle.kts
deleted file mode 100644
index f9c3d13..0000000
--- a/buildSrc/src/main/kotlin/buildsrc/conventions/code-quality.gradle.kts
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Copyright 2001-2023 Geert Bevin (gbevin[remove] at uwyn dot com)
- * Copyright 2022-2023 Erik C. Thauvin (erik@thauvin.net)
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License 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.
- */
-
-package buildsrc.conventions
-
-import buildsrc.utils.Rife2TestListener
-import org.gradle.api.tasks.testing.logging.TestExceptionFormat
-import org.gradle.api.tasks.testing.logging.TestLogEvent
-import org.sonarqube.gradle.SonarTask
-
-plugins {
- id("org.sonarqube")
- id("io.gitlab.arturbosch.detekt")
- id("org.jetbrains.kotlinx.kover")
-}
-
-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/report.xml")
- }
-}
-
-tasks.withType().configureEach {
- dependsOn(tasks.matching { it.name == "koverXmlReport" })
-}
-
-tasks.withType().configureEach {
- val testsBadgeApiKey = providers.gradleProperty("testsBadgeApiKey")
- addTestListener(Rife2TestListener(testsBadgeApiKey))
- testLogging {
- exceptionFormat = TestExceptionFormat.FULL
- events = setOf(TestLogEvent.PASSED, TestLogEvent.SKIPPED, TestLogEvent.FAILED)
- }
-}
diff --git a/buildSrc/src/main/kotlin/buildsrc/conventions/lang/kotlin-jvm.gradle.kts b/buildSrc/src/main/kotlin/buildsrc/conventions/lang/kotlin-jvm.gradle.kts
deleted file mode 100644
index 790e694..0000000
--- a/buildSrc/src/main/kotlin/buildsrc/conventions/lang/kotlin-jvm.gradle.kts
+++ /dev/null
@@ -1,42 +0,0 @@
-package buildsrc.conventions.lang
-
-import buildsrc.utils.Rife2TestListener
-import org.gradle.api.JavaVersion
-import org.gradle.api.tasks.testing.Test
-import org.gradle.api.tasks.testing.logging.TestExceptionFormat
-import org.gradle.api.tasks.testing.logging.TestLogEvent
-import org.gradle.kotlin.dsl.withType
-import org.jetbrains.kotlin.gradle.dsl.JvmTarget
-import org.jetbrains.kotlin.gradle.targets.jvm.KotlinJvmTarget
-import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
-import org.sonarqube.gradle.SonarTask
-
-/**
- * Common configuration for Kotlin/JVM projects
- *
- * (this can be removed after Kotlin Multiplatform migration)
- */
-
-plugins {
- id("buildsrc.conventions.base")
- kotlin("jvm")
- id("buildsrc.conventions.code-quality")
-}
-
-java {
- withSourcesJar()
-}
-
-kotlin {
- jvmToolchain(11)
-}
-
-tasks.withType().configureEach {
- compilerOptions {
- jvmTarget.set(JvmTarget.JVM_11)
- }
-}
-
-tasks.withType().configureEach {
- useJUnitPlatform()
-}
diff --git a/buildSrc/src/main/kotlin/buildsrc/conventions/lang/kotlin-multiplatform-base.gradle.kts b/buildSrc/src/main/kotlin/buildsrc/conventions/lang/kotlin-multiplatform-base.gradle.kts
deleted file mode 100644
index 4af978b..0000000
--- a/buildSrc/src/main/kotlin/buildsrc/conventions/lang/kotlin-multiplatform-base.gradle.kts
+++ /dev/null
@@ -1,45 +0,0 @@
-package buildsrc.conventions.lang
-
-import org.jetbrains.kotlin.gradle.targets.jvm.KotlinJvmTarget
-
-
-/**
- * Base configuration for all Kotlin/Multiplatform conventions.
- *
- * This plugin does not enable any Kotlin target. To enable a target in a subproject, prefer applying specific Kotlin
- * target convention plugins.
- */
-
-plugins {
- id("buildsrc.conventions.base")
- kotlin("multiplatform")
-}
-
-
-kotlin {
- jvmToolchain(11)
-
- targets.configureEach {
- compilations.configureEach {
- kotlinOptions {
- // nothin' yet
- }
- }
- }
-
- // configure all Kotlin/JVM Tests to use JUnit
- targets.withType().configureEach {
- testRuns.configureEach {
- executionTask.configure {
- useJUnitPlatform()
- }
- }
- }
-
- sourceSets.configureEach {
- languageSettings {
-// languageVersion =
-// apiVersion =
- }
- }
-}
diff --git a/buildSrc/src/main/kotlin/buildsrc/conventions/lang/kotlin-multiplatform-js.gradle.kts b/buildSrc/src/main/kotlin/buildsrc/conventions/lang/kotlin-multiplatform-js.gradle.kts
deleted file mode 100644
index 2a0034a..0000000
--- a/buildSrc/src/main/kotlin/buildsrc/conventions/lang/kotlin-multiplatform-js.gradle.kts
+++ /dev/null
@@ -1,18 +0,0 @@
-package buildsrc.conventions.lang
-
-/** conventions for a Kotlin/JS subproject */
-
-plugins {
- id("buildsrc.conventions.lang.kotlin-multiplatform-base")
-}
-
-kotlin {
- targets {
- js(IR) {
- browser()
- nodejs()
- }
- }
-}
-
-relocateKotlinJsStore()
diff --git a/buildSrc/src/main/kotlin/buildsrc/conventions/lang/kotlin-multiplatform-jvm.gradle.kts b/buildSrc/src/main/kotlin/buildsrc/conventions/lang/kotlin-multiplatform-jvm.gradle.kts
deleted file mode 100644
index 6bbef24..0000000
--- a/buildSrc/src/main/kotlin/buildsrc/conventions/lang/kotlin-multiplatform-jvm.gradle.kts
+++ /dev/null
@@ -1,11 +0,0 @@
-package buildsrc.conventions.lang
-
-plugins {
- id("buildsrc.conventions.lang.kotlin-multiplatform-base")
-}
-
-kotlin {
- jvm {
- withJava()
- }
-}
diff --git a/buildSrc/src/main/kotlin/buildsrc/conventions/lang/kotlin-multiplatform-native.gradle.kts b/buildSrc/src/main/kotlin/buildsrc/conventions/lang/kotlin-multiplatform-native.gradle.kts
deleted file mode 100644
index 7e8bb2a..0000000
--- a/buildSrc/src/main/kotlin/buildsrc/conventions/lang/kotlin-multiplatform-native.gradle.kts
+++ /dev/null
@@ -1,102 +0,0 @@
-package buildsrc.conventions.lang
-
-/** conventions for a Kotlin/Native subproject */
-
-plugins {
- id("buildsrc.conventions.lang.kotlin-multiplatform-base")
-}
-
-kotlin {
-
- // Native targets all extend commonMain and commonTest.
- //
- // Some targets (ios, tvos, watchos) are shortcuts provided by the Kotlin DSL, that
- // provide additional targets, except for 'simulators' which must be defined manually.
- // https://kotlinlang.org/docs/multiplatform-share-on-platforms.html#use-target-shortcuts
- //
- // common/
- // └── native/
- // ├── linuxX64
- // ├── mingwX64
- // ├── macosX64
- // ├── macosArm64
- // ├── ios/ (shortcut)
- // │ ├── iosArm64
- // │ ├── iosX64
- // │ └── iosSimulatorArm64
- // ├── tvos/ (shortcut)
- // │ ├── tvosArm64
- // │ ├── tvosX64
- // │ └── tvosSimulatorArm64Main
- // └── watchos/ (shortcut)
- // ├── watchosArm32
- // ├── watchosArm64
- // ├── watchosX64
- // └── watchosSimulatorArm64Main
-
- targets {
- linuxX64()
-
- mingwX64()
-
- macosX64()
- macosArm64()
-
- // https://kotlinlang.org/docs/multiplatform-share-on-platforms.html#use-target-shortcuts
- ios() // iosArm64, iosX64
- watchos() // watchosArm32, watchosArm64, watchosX64
- tvos() // tvosArm64, tvosX64
-
- iosSimulatorArm64()
- tvosSimulatorArm64()
- watchosSimulatorArm64()
- }
-
- @Suppress("UNUSED_VARIABLE")
- sourceSets {
- val commonMain by getting {}
- val commonTest by getting {}
-
- val nativeMain by creating { dependsOn(commonMain) }
- val nativeTest by creating { dependsOn(commonTest) }
-
- // Linux
- val linuxX64Main by getting { dependsOn(nativeMain) }
- val linuxX64Test by getting { dependsOn(nativeTest) }
-
- // Windows - MinGW
- val mingwX64Main by getting { dependsOn(nativeMain) }
- val mingwX64Test by getting { dependsOn(nativeTest) }
-
- // Apple - macOS
- val macosArm64Main by getting { dependsOn(nativeMain) }
- val macosArm64Test by getting { dependsOn(nativeTest) }
-
- val macosX64Main by getting { dependsOn(nativeMain) }
- val macosX64Test by getting { dependsOn(nativeTest) }
-
- // Apple - iOS
- val iosMain by getting { dependsOn(nativeMain) }
- val iosTest by getting { dependsOn(nativeTest) }
-
-// val iosSimulatorArm64Main by getting { dependsOn(iosMain) }
-// val iosSimulatorArm64Test by getting { dependsOn(iosTest) }
-
-// // Apple - tvOS
-// val tvosMain by getting { dependsOn(nativeMain) }
-// val tvosTest by getting { dependsOn(nativeTest) }
-//
-// val tvosSimulatorArm64Main by getting { dependsOn(tvosMain) }
-// val tvosSimulatorArm64Test by getting { dependsOn(tvosTest) }
-//
-// // Apple - watchOS
-// val watchosMain by getting { dependsOn(nativeMain) }
-// val watchosTest by getting { dependsOn(nativeTest) }
-//
-// val watchosSimulatorArm64Main by getting { dependsOn(watchosMain) }
-// val watchosSimulatorArm64Test by getting { dependsOn(watchosTest) }
-
- // val iosArm32Main by getting { dependsOn(desktopMain) }
- // val iosArm32Test by getting { dependsOn(nativeTest) }
- }
-}
diff --git a/buildSrc/src/main/kotlin/buildsrc/conventions/lang/kotlinJsExtensions.kt b/buildSrc/src/main/kotlin/buildsrc/conventions/lang/kotlinJsExtensions.kt
deleted file mode 100644
index eefdc94..0000000
--- a/buildSrc/src/main/kotlin/buildsrc/conventions/lang/kotlinJsExtensions.kt
+++ /dev/null
@@ -1,18 +0,0 @@
-package buildsrc.conventions.lang
-
-import org.gradle.api.Project
-import org.gradle.kotlin.dsl.configure
-import org.jetbrains.kotlin.gradle.targets.js.yarn.YarnRootExtension
-
-/**
- * `kotlin-js` and `kotlin-multiplatform` plugins adds a directory in the root-dir for the Yarn
- * lockfile. That's a bit annoying. It's a little neater if it's in the Gradle dir, next to the
- * version catalog.
- */
-internal fun Project.relocateKotlinJsStore() {
- afterEvaluate {
- rootProject.extensions.configure {
- lockFileDirectory = project.rootDir.resolve("gradle/kotlin-js-store")
- }
- }
-}
diff --git a/buildSrc/src/main/kotlin/buildsrc/conventions/publishing.gradle.kts b/buildSrc/src/main/kotlin/buildsrc/conventions/publishing.gradle.kts
deleted file mode 100644
index 2390479..0000000
--- a/buildSrc/src/main/kotlin/buildsrc/conventions/publishing.gradle.kts
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- * Copyright 2001-2023 Geert Bevin (gbevin[remove] at uwyn dot com)
- * Copyright 2022-2023 Erik C. Thauvin (erik@thauvin.net)
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License 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.
- */
-package buildsrc.conventions
-
-plugins {
- id("maven-publish")
- id("signing")
- id("org.jetbrains.dokka")
-}
-
-val gitHub = "ethauvin/${rootProject.name}"
-val mavenUrl = "https://github.com/$gitHub"
-val isSnapshotVersion = { project.version.toString().contains("SNAPSHOT") }
-
-publishing {
- publications {
- withType().configureEach {
- pom {
- name.set("UrlEncoder 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(
- if (isSnapshotVersion()) {
- uri("https://oss.sonatype.org/content/repositories/snapshots/")
- } else {
- uri("https://oss.sonatype.org/service/local/staging/deploy/maven2/")
- }
- ) {
- name = "ossrh"
- credentials(PasswordCredentials::class)
- }
- }
-}
-
-signing {
- useGpgCmd()
- sign(publishing.publications)
-
- setRequired({
- !isSnapshotVersion() || gradle.taskGraph.hasTask("publish")
- })
-}
-tasks.withType().configureEach {
- val signingRequiredPredicate = provider { signing.isRequired }
- onlyIf { signingRequiredPredicate.get() }
-}
-
-// https://youtrack.jetbrains.com/issue/KT-46466
-val signingTasks = tasks.withType()
-tasks.withType().configureEach {
- dependsOn(signingTasks)
-}
-
-val javadocJar by tasks.registering(Jar::class) {
- dependsOn(tasks.dokkaJavadoc)
- from(tasks.dokkaJavadoc)
- archiveClassifier.set("javadoc")
-}
diff --git a/buildSrc/src/main/kotlin/buildsrc/utils/Rife2TestListener.kt b/buildSrc/src/main/kotlin/buildsrc/utils/Rife2TestListener.kt
deleted file mode 100644
index 748b064..0000000
--- a/buildSrc/src/main/kotlin/buildsrc/utils/Rife2TestListener.kt
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * Copyright 2001-2023 Geert Bevin (gbevin[remove] at uwyn dot com)
- * Copyright 2022-2023 Erik C. Thauvin (erik@thauvin.net)
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License 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.
- */
-
-package buildsrc.utils
-
-import org.gradle.api.provider.Provider
-import org.gradle.api.tasks.testing.TestDescriptor
-import org.gradle.api.tasks.testing.TestListener
-import org.gradle.api.tasks.testing.TestResult
-import java.net.URI
-import java.net.http.HttpClient
-import java.net.http.HttpRequest
-import java.net.http.HttpResponse
-
-class Rife2TestListener(
- private val testBadgeApiKey: Provider
-) : 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
-
- val apiKey = testBadgeApiKey.orNull
-
- if (apiKey != null) {
- 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())
- }
- }
- }
-}
diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar
index c1962a7..943f0cb 100644
Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
index 37aef8d..f398c33 100644
--- a/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -1,6 +1,6 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-8.1.1-bin.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-7.6-bin.zip
networkTimeout=10000
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
diff --git a/gradlew b/gradlew
index aeb74cb..65dcd68 100755
--- a/gradlew
+++ b/gradlew
@@ -85,6 +85,9 @@ done
APP_BASE_NAME=${0##*/}
APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
+
# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD=maximum
@@ -141,7 +144,7 @@ if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
case $MAX_FD in #(
max*)
# In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked.
- # shellcheck disable=SC3045
+ # shellcheck disable=SC3045
MAX_FD=$( ulimit -H -n ) ||
warn "Could not query maximum file descriptor limit"
esac
@@ -149,7 +152,7 @@ if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
'' | soft) :;; #(
*)
# In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked.
- # shellcheck disable=SC3045
+ # shellcheck disable=SC3045
ulimit -n "$MAX_FD" ||
warn "Could not set maximum file descriptor limit to $MAX_FD"
esac
@@ -194,10 +197,6 @@ if "$cygwin" || "$msys" ; then
done
fi
-
-# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
-DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
-
# Collect all arguments for the java command;
# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of
# shell script including quotes and variable substitutions, so put them in
diff --git a/lib/build.gradle.kts b/lib/build.gradle.kts
index eb0edae..5b12abf 100644
--- a/lib/build.gradle.kts
+++ b/lib/build.gradle.kts
@@ -1,17 +1,42 @@
+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 {
- buildsrc.conventions.lang.`kotlin-jvm`
- buildsrc.conventions.publishing
id("application")
- id("com.github.ben-manes.versions")
+ 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.3.1-SNAPSHOT"
-val deployDir = project.layout.projectDirectory.dir("deploy")
-val urlEncoderMainClass = "net.thauvin.erik.urlencoder.UrlEncoder"
+
+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")
@@ -22,19 +47,42 @@ base {
archivesName.set(rootProject.name)
}
+java {
+ sourceCompatibility = JavaVersion.VERSION_11
+ targetCompatibility = JavaVersion.VERSION_11
+ withSourcesJar()
+}
+
application {
- mainClass.set(urlEncoderMainClass)
+ 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"] = urlEncoderMainClass
+ attributes["Main-Class"] = myClassName
}
}
- val fatJar by registering(Jar::class) {
- group = LifecycleBasePlugin.BUILD_GROUP
+ val fatJar = register("fatJar") {
+ group = "build"
dependsOn.addAll(listOf("compileJava", "compileKotlin", "processResources"))
archiveClassifier.set("all")
duplicatesStrategy = DuplicatesStrategy.EXCLUDE
@@ -49,10 +97,65 @@ tasks {
dependsOn(fatJar)
}
- withType().configureEach {
+ 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") {
@@ -61,9 +164,7 @@ tasks {
}
}
- val copyToDeploy by registering(Sync::class) {
- description = "Copies all needed files to the 'deploy' directory."
- group = PublishingPlugin.PUBLISH_TASK_GROUP
+ val copyToDeploy by registering(Copy::class) {
from(configurations.runtimeClasspath) {
exclude("annotations-*.jar")
}
@@ -72,22 +173,73 @@ tasks {
}
register("deploy") {
- description = "Copies all needed files to the 'deploy' directory."
+ description = "Copies all needed files to the $deployDir directory."
group = PublishingPlugin.PUBLISH_TASK_GROUP
- dependsOn(build, copyToDeploy)
+ dependsOn(clean, build, jar)
+ outputs.dir(deployDir)
+ inputs.files(copyToDeploy)
+ mustRunAfter(clean)
}
- clean {
- delete(deployDir)
+ "sonar" {
+ dependsOn(koverReport)
}
}
publishing {
publications {
- create("mavenJava") {
+ create(publicationName) {
from(components["java"])
artifactId = rootProject.name
- artifact(tasks.javadocJar)
+ 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])
+}
diff --git a/lib/pom.xml b/lib/pom.xml
index 5956aa0..8af3e06 100644
--- a/lib/pom.xml
+++ b/lib/pom.xml
@@ -8,7 +8,7 @@
4.0.0
net.thauvin.erik
urlencoder
- 1.4.0-SNAPSHOT
+ 1.3.1-SNAPSHOT
UrlEncoder for Kotlin
A simple defensive library to encode/decode URL components
https://github.com/ethauvin/urlencoder
@@ -45,7 +45,7 @@
org.jetbrains.kotlin
kotlin-stdlib-jdk8
- 1.8.21
+ 1.8.0
compile
diff --git a/lib/pom.xml.asc b/lib/pom.xml.asc
deleted file mode 100644
index fb5746a..0000000
--- a/lib/pom.xml.asc
+++ /dev/null
@@ -1,17 +0,0 @@
------BEGIN PGP SIGNATURE-----
-Version: BCPG v1.68
-
-iQIzBAABCAAdFiEEOckYpvaxKUI3I6Pxd2cCpqLaMw4FAmO46y8ACgkQd2cCpqLa
-Mw49qg//YPTr/FbXTVDB2KsPRRRMAMf3tQxvYknuMJsAIOTq9XfkmWM6XY+A1L6+
-Up98MLrBMFKckrZ90bypTCZGhIi52yoE6StchFMJiuLGE+OwQIwPxaX0LNN3pLD6
-BE5muGYZV762PeTkNU0oXNX+e0ReATnUHiriNvz9mZN/xDQLQ+C54wlu9wTKVC6l
-beDezJsNYS4OhQJuJk4bm7w5umEocvbOydzSa/a95hQY9EfsQOUkc4jdGbDRGjKX
-ladPDl8B+Y1+peJDkzcgL+A2T0mJ4bxouI32cGyQBXvawfcfz7ksifhoRDyESXrt
-YoQMcVb9Bnv/k2r4jPSb92znTwCWY7joXrTE44C3wUk6cg8QoCEmjAdEfxwCM17f
-pYIoejBGAMp3xYmzBJg4017e+Tg8hR2SrQHAF65GezEi/d9SOAevEp9aOPPSWOI1
-0LgMcBAE9yxCF2r8EHpFyD2dHfaOI9kKsBfGyKn+8ksu75l6bCZRFJu4syYaNLZn
-b9kHAHgmfikKMnHBZGr/SqYADnCLr/PwJFOhACDYtbhcXVm4PJT3l6Yep8xG1N84
-+qTFA6CuOZjAklonbroHlkgn8ixhuC9ZNtKaIH6zvdG9SoaN4yMu7Itk6GtAAQy6
-qCB+3oylZlKjh1mVo9X8iatL8rdgn8dsEwvC+ItsjsnxXtCPhX4=
-=amWH
------END PGP SIGNATURE-----
diff --git a/settings.gradle.kts b/settings.gradle.kts
index e75db1d..0cb10ee 100644
--- a/settings.gradle.kts
+++ b/settings.gradle.kts
@@ -1,25 +1,12 @@
+/*
+ * This file was generated by the Gradle 'init' task.
+ *
+ * The settings file is used to specify which projects to include in your build.
+ *
+ * Detailed information about configuring a multi-project build in Gradle can be found
+ * in the user manual at https://docs.gradle.org/7.6/userguide/multi_project_builds.html
+ * This project uses @Incubating APIs which are subject to change.
+ */
+
rootProject.name = "urlencoder"
-
-pluginManagement {
- repositories {
- mavenCentral()
- gradlePluginPortal()
- }
-}
-
-@Suppress("UnstableApiUsage")
-dependencyResolutionManagement {
- repositoriesMode.set(RepositoriesMode.PREFER_SETTINGS)
-
- repositories {
- mavenCentral()
- maven("https://oss.sonatype.org/content/repositories/snapshots") {
- name = "Sonatype Snapshots"
- mavenContent { snapshotsOnly() }
- }
- }
-}
-
-include(
- ":lib",
-)
+include("lib")