diff --git a/.gitignore b/.gitignore index 13a066e..0742f86 100644 --- a/.gitignore +++ b/.gitignore @@ -64,7 +64,6 @@ dist/ ehthumbs.db fabric.properties gen/ -gradle.properties hs_err_pid* kobaltBuild kobaltw*-test diff --git a/.idea/kotlinc.xml b/.idea/kotlinc.xml index 69e8615..9a55c2d 100644 --- a/.idea/kotlinc.xml +++ b/.idea/kotlinc.xml @@ -1,6 +1,6 @@ - \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml index 77113c7..caf34dd 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,4 +1,3 @@ - diff --git a/README.md b/README.md index 032d886..430ef3b 100644 --- a/README.md +++ b/README.md @@ -17,9 +17,9 @@ A simple library to retrieve jokes from [Sv443's JokeAPI](https://v2.jokeapi.dev ```kotlin import net.thauvin.erik.jokeapi.getJoke -val joke = getJoke() -val safe = getJoke(safe = true) -val pun = getJoke(categories = setOf(Category.PUN)) +val joke = joke() +val safe = joke(safe = true) +val pun = joke(categories = setOf(Category.PUN)) ``` The parameters match the [joke endpoint](https://v2.jokeapi.dev/#joke-endpoint). @@ -41,7 +41,7 @@ data class Joke( To retrieve multiple jokes: ```kotlin -val frenchJokes = getJokes(amount = 2, type = Type.TWOPART, lang = Language.FR) +val frenchJokes = jokes(amount = 2, type = Type.TWOPART, lang = Language.FR) frenchJokes.forEach { println(it.joke.joinToString("\n")) println("-".repeat(46)) @@ -85,7 +85,7 @@ var config = new JokeConfig.Builder() .type(Type.SINGLE) .safe(true) .build(); -var joke = JokeApi.getJoke(config); +var joke = JokeApi.joke(config); joke.getJoke().forEach(System.out::println); ``` ## Gradle, Maven, etc. diff --git a/build.gradle.kts b/build.gradle.kts index aad8839..b7a2df9 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -5,14 +5,14 @@ import org.jetbrains.kotlin.gradle.tasks.KotlinCompile plugins { id("com.github.ben-manes.versions") version "0.47.0" - id("io.gitlab.arturbosch.detekt") version "1.23.0" + id("io.gitlab.arturbosch.detekt") version "1.23.1" id("java") id("maven-publish") - id("org.jetbrains.dokka") version "1.8.20" - id("org.jetbrains.kotlinx.kover") version "0.7.2" - id("org.sonarqube") version "4.2.1.3168" + id("org.jetbrains.dokka") version "1.9.0" + id("org.jetbrains.kotlinx.kover") version "0.7.3" + id("org.sonarqube") version "4.3.1.3277" id("signing") - kotlin("jvm") version "1.8.22" + kotlin("jvm") version "1.9.10" } description = "Wrapper for Sv443's JokeAPI" @@ -36,7 +36,7 @@ dependencies { implementation("org.json:json:20230618") testImplementation(kotlin("test")) - testImplementation("org.junit.jupiter:junit-jupiter:5.9.2") + testImplementation("org.junit.jupiter:junit-jupiter:5.10.0") testImplementation("com.willowtreeapps.assertk:assertk-jvm:0.26.1") } @@ -63,7 +63,7 @@ sonarqube { 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") + property("sonar.coverage.jacoco.xmlReportPaths", "${project.layout.buildDirectory}/reports/kover/report.xml") } } diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 0000000..7fc6f1f --- /dev/null +++ b/gradle.properties @@ -0,0 +1 @@ +kotlin.code.style=official diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index c1962a7..7f93135 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..ac72c34 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,7 @@ 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-8.3-bin.zip networkTimeout=10000 +validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew index aeb74cb..0adc8e1 100755 --- a/gradlew +++ b/gradlew @@ -83,7 +83,8 @@ done # This is normally unused # shellcheck disable=SC2034 APP_BASE_NAME=${0##*/} -APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit +# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) +APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD=maximum @@ -130,10 +131,13 @@ location of your Java installation." fi else JAVACMD=java - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + if ! command -v java >/dev/null 2>&1 + then + die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. Please set the JAVA_HOME variable in your environment to match the location of your Java installation." + fi fi # Increase the maximum file descriptors if we can. diff --git a/src/main/kotlin/net/thauvin/erik/jokeapi/JokeApi.kt b/src/main/kotlin/net/thauvin/erik/jokeapi/JokeApi.kt index 05b1bb1..48e9415 100644 --- a/src/main/kotlin/net/thauvin/erik/jokeapi/JokeApi.kt +++ b/src/main/kotlin/net/thauvin/erik/jokeapi/JokeApi.kt @@ -103,7 +103,7 @@ object JokeApi { @JvmStatic @Throws(HttpErrorException::class) fun getRawJokes(config: JokeConfig): String { - return getRawJokes( + return rawJokes( categories = config.categories, lang = config.language, blacklistFlags = config.flags, @@ -125,8 +125,8 @@ object JokeApi { @JvmStatic @JvmOverloads @Throws(HttpErrorException::class, JokeException::class) - fun getJoke(config: JokeConfig = JokeConfig.Builder().build()): Joke { - return getJoke( + fun joke(config: JokeConfig = JokeConfig.Builder().build()): Joke { + return joke( categories = config.categories, lang = config.language, blacklistFlags = config.flags, @@ -146,8 +146,8 @@ object JokeApi { */ @JvmStatic @Throws(HttpErrorException::class, JokeException::class) - fun getJokes(config: JokeConfig): Array { - return getJokes( + fun jokes(config: JokeConfig): Array { + return jokes( categories = config.categories, lang = config.language, blacklistFlags = config.flags, @@ -170,7 +170,7 @@ object JokeApi { * * @param splitNewLine Split newline within [Type.SINGLE] joke. */ -fun getJoke( +fun joke( categories: Set = setOf(Category.ANY), lang: Language = Language.EN, blacklistFlags: Set = emptySet(), @@ -182,7 +182,7 @@ fun getJoke( splitNewLine: Boolean = false ): Joke { val json = JSONObject( - getRawJokes( + rawJokes( categories = categories, lang = lang, blacklistFlags = blacklistFlags, @@ -208,7 +208,7 @@ fun getJoke( * @param amount The required amount of jokes to return. * @param splitNewLine Split newline within [Type.SINGLE] joke. */ -fun getJokes( +fun jokes( amount: Int, categories: Set = setOf(Category.ANY), lang: Language = Language.EN, @@ -221,7 +221,7 @@ fun getJokes( splitNewLine: Boolean = false ): Array { val json = JSONObject( - getRawJokes( + rawJokes( categories = categories, lang = lang, blacklistFlags = blacklistFlags, @@ -250,7 +250,7 @@ fun getJokes( * * Sse the [JokeAPI Documentation](https://jokeapi.dev/#joke-endpoint) for more details. */ -fun getRawJokes( +fun rawJokes( categories: Set = setOf(Category.ANY), lang: Language = Language.EN, blacklistFlags: Set = emptySet(), diff --git a/src/test/kotlin/net/thauvin/erik/jokeapi/ExceptionsTest.kt b/src/test/kotlin/net/thauvin/erik/jokeapi/ExceptionsTest.kt index b8eab48..adacf75 100644 --- a/src/test/kotlin/net/thauvin/erik/jokeapi/ExceptionsTest.kt +++ b/src/test/kotlin/net/thauvin/erik/jokeapi/ExceptionsTest.kt @@ -58,10 +58,10 @@ internal class ExceptionsTest { @Test fun `Validate Joke Exception`() { val e = assertThrows { - getJoke(categories = setOf(Category.CHRISTMAS), contains = "foo") + joke(categories = setOf(Category.CHRISTMAS), contains = "foo") } logger.fine(e.debug()) - assertThat(e, "getJoke(${Category.CHRISTMAS},foo)").all { + assertThat(e, "joke(${Category.CHRISTMAS},foo)").all { prop(JokeException::code).isEqualTo(106) prop(JokeException::internalError).isFalse() prop(JokeException::message).isEqualTo("No matching joke found") diff --git a/src/test/kotlin/net/thauvin/erik/jokeapi/GetJokeTest.kt b/src/test/kotlin/net/thauvin/erik/jokeapi/GetJokeTest.kt index dd6b119..a2b06db 100644 --- a/src/test/kotlin/net/thauvin/erik/jokeapi/GetJokeTest.kt +++ b/src/test/kotlin/net/thauvin/erik/jokeapi/GetJokeTest.kt @@ -64,9 +64,9 @@ import org.junit.jupiter.api.extension.ExtendWith internal class GetJokeTest { @Test fun `Get Joke`() { - val joke = getJoke() + val joke = joke() logger.fine(joke.toString()) - assertThat(joke, "getJoke()").all { + assertThat(joke, "joke()").all { prop(Joke::joke).isNotEmpty() prop(Joke::type).isIn(Type.SINGLE, Type.TWOPART) prop(Joke::id).isGreaterThanOrEqualTo(0) @@ -76,23 +76,23 @@ internal class GetJokeTest { @Test fun `Get Joke without Blacklist Flags`() { - val joke = getJoke(blacklistFlags = setOf(Flag.ALL)) + val joke = joke(blacklistFlags = setOf(Flag.ALL)) assertThat(joke::flags).isEmpty() } @Test fun `Get Joke without any Blacklist Flags`() { val allFlags = Flag.values().filter { it != Flag.ALL }.toSet() - val joke = getJoke(blacklistFlags = allFlags) + val joke = joke(blacklistFlags = allFlags) assertThat(joke::flags).isEmpty() } @Test fun `Get Joke with ID`() { val id = 172 - val joke = getJoke(idRange = IdRange(id)) + val joke = joke(idRange = IdRange(id)) logger.fine(joke.toString()) - assertThat(joke, "getJoke($id)").all { + assertThat(joke, "joke($id)").all { prop(Joke::flags).all { contains(Flag.EXPLICIT) contains(Flag.NSFW) @@ -105,7 +105,7 @@ internal class GetJokeTest { @Test fun `Get Joke with ID Range`() { val idRange = IdRange(1, 100) - val joke = getJoke(idRange = idRange) + val joke = joke(idRange = idRange) logger.fine(joke.toString()) assertThat(joke::id).isBetween(idRange.start, idRange.end) } @@ -113,24 +113,24 @@ internal class GetJokeTest { @Test fun `Get Joke with invalid ID Range`() { val idRange = IdRange(100, 1) - val e = assertThrows { getJoke(idRange = idRange, lang = Language.DE) } + val e = assertThrows { joke(idRange = idRange, lang = Language.DE) } assertThat(e::message).isNotNull().contains("100, 1") } @Test fun `Get Joke with max ID Range`() { val idRange = IdRange(1, 30000) - val e = assertThrows { getJoke(idRange = idRange) } - assertThat(e, "getJoke{${idRange})").all { + val e = assertThrows { joke(idRange = idRange) } + assertThat(e, "joke{${idRange})").all { prop(JokeException::additionalInfo).contains("ID range") } } @Test fun `Get Joke with two Categories`() { - val joke = getJoke(categories = setOf(Category.PROGRAMMING, Category.MISC)) + val joke = joke(categories = setOf(Category.PROGRAMMING, Category.MISC)) logger.fine(joke.toString()) - assertThat(joke.category, "getJoke(${Category.PROGRAMMING},${Category.MISC})").isIn( + assertThat(joke.category, "joke(${Category.PROGRAMMING},${Category.MISC})").isIn( Category.PROGRAMMING, Category.MISC ) @@ -139,28 +139,28 @@ internal class GetJokeTest { @Test fun `Get Joke with each Categories`() { Category.values().filter { it != Category.ANY }.forEach { - val joke = getJoke(categories = setOf(it)) + val joke = joke(categories = setOf(it)) logger.fine(joke.toString()) - assertThat(joke::category, "getJoke($it)").prop(Category::value).isEqualTo(it.value) + assertThat(joke::category, "joke($it)").prop(Category::value).isEqualTo(it.value) } } @Test fun `Get Joke with each Languages`() { Language.values().forEach { - val joke = getJoke(lang = it) + val joke = joke(lang = it) logger.fine(joke.toString()) - assertThat(joke::lang, "getJoke($it)").prop(Language::value).isEqualTo(it.value) + assertThat(joke::lang, "joke($it)").prop(Language::value).isEqualTo(it.value) } } @Test fun `Get Joke with Split Newline`() { - val joke = getJoke( + val joke = joke( categories = setOf(Category.DARK), type = Type.SINGLE, idRange = IdRange(178), splitNewLine = true ) logger.fine(joke.toString()) - assertThat(joke::joke, "getJoke(splitNewLine=true)").all { + assertThat(joke::joke, "joke(splitNewLine=true)").all { size().isEqualTo(2) each { containsNone("\n") @@ -170,25 +170,25 @@ internal class GetJokeTest { @Test fun `Get Safe Joke`() { - val joke = getJoke(safe = true) + val joke = joke(safe = true) logger.fine(joke.toString()) - assertThat(joke, "getJoke(safe)").all { + assertThat(joke, "joke(safe)").all { prop(Joke::safe).isTrue() } } @Test fun `Get Single Joke`() { - val joke = getJoke(type = Type.SINGLE) + val joke = joke(type = Type.SINGLE) logger.fine(joke.toString()) assertThat(joke::type).assertThat(Type.SINGLE) } @Test fun `Get Two-Parts Joke`() { - val joke = getJoke(type = Type.TWOPART) + val joke = joke(type = Type.TWOPART) logger.fine(joke.toString()) - assertThat(joke, "getJoke(${Type.TWOPART})").all { + assertThat(joke, "joke(${Type.TWOPART})").all { prop(Joke::type).isEqualTo(Type.TWOPART) prop(Joke::joke).size().isGreaterThan(1) } @@ -199,9 +199,9 @@ internal class GetJokeTest { val id = 265 val search = "his wife" val joke = - getJoke(contains = search, categories = setOf(Category.PROGRAMMING), idRange = IdRange(id), safe = true) + joke(contains = search, categories = setOf(Category.PROGRAMMING), idRange = IdRange(id), safe = true) logger.fine(joke.toString()) - assertThat(joke, "getJoke($search)").all { + assertThat(joke, "joke($search)").all { prop(Joke::id).isEqualTo(id) prop(Joke::joke).any { it.contains(search) diff --git a/src/test/kotlin/net/thauvin/erik/jokeapi/GetJokesTest.kt b/src/test/kotlin/net/thauvin/erik/jokeapi/GetJokesTest.kt index ffaa73d..1ab8b60 100644 --- a/src/test/kotlin/net/thauvin/erik/jokeapi/GetJokesTest.kt +++ b/src/test/kotlin/net/thauvin/erik/jokeapi/GetJokesTest.kt @@ -53,7 +53,7 @@ internal class GetJokesTest { @Test fun `Get Multiple Jokes`() { val amount = 2 - val jokes = getJokes(amount = amount, safe = true, lang = Language.FR) + val jokes = jokes(amount = amount, safe = true, lang = Language.FR) assertThat(jokes, "jokes").all { size().isEqualTo(amount) each { @@ -66,13 +66,13 @@ internal class GetJokesTest { @Test fun `Get Jokes with Invalid Amount`() { - val e = assertThrows { getJokes(amount = -1) } + val e = assertThrows { jokes(amount = -1) } assertThat(e::message).isNotNull().contains("-1") } @Test fun `Get One Joke as Multiple`() { - val jokes = getJokes(amount = 1, safe = true) + val jokes = jokes(amount = 1, safe = true) assertThat(jokes, "jokes").all { size().isEqualTo(1) index(0).all { diff --git a/src/test/kotlin/net/thauvin/erik/jokeapi/GetRawJokesTest.kt b/src/test/kotlin/net/thauvin/erik/jokeapi/GetRawJokesTest.kt index 0c110ce..7bcf1c6 100644 --- a/src/test/kotlin/net/thauvin/erik/jokeapi/GetRawJokesTest.kt +++ b/src/test/kotlin/net/thauvin/erik/jokeapi/GetRawJokesTest.kt @@ -46,8 +46,8 @@ import kotlin.test.assertContains internal class GetRawJokesTest { @Test fun `Get Raw Joke with TXT`() { - val response = getRawJokes(format = Format.TXT) - assertThat(response, "getRawJoke(txt)").all { + val response = rawJokes(format = Format.TXT) + assertThat(response, "rawJoke(txt)").all { isNotEmpty() doesNotContain("Error") } @@ -55,25 +55,25 @@ internal class GetRawJokesTest { @Test fun `Get Raw Joke with XML`() { - val response = getRawJokes(format = Format.XML) - assertThat(response, "getRawJoke(xml)").startsWith("\n\n false") + val response = rawJokes(format = Format.XML) + assertThat(response, "rawJoke(xml)").startsWith("\n\n false") } @Test fun `Get Raw Joke with YAML`() { - val response = getRawJokes(format = Format.YAML) - assertThat(response, "getRawJoke(yaml)").startsWith("error: false") + val response = rawJokes(format = Format.YAML) + assertThat(response, "rawJoke(yaml)").startsWith("error: false") } @Test fun `Get Raw Jokes`() { - val response = getRawJokes(amount = 2) - assertContains(response, "\"amount\": 2", false, "getRawJoke(2)") + val response = rawJokes(amount = 2) + assertContains(response, "\"amount\": 2", false, "rawJoke(2)") } @Test fun `Get Raw Invalid Jokes`() { - val response = getRawJokes(contains = "foo", safe = true, amount = 2, idRange = IdRange(160, 161)) + val response = rawJokes(contains = "foo", safe = true, amount = 2, idRange = IdRange(160, 161)) assertContains(response, "\"error\": true", false, "getRawJokes(foo)") } } diff --git a/src/test/kotlin/net/thauvin/erik/jokeapi/JokeConfigTest.kt b/src/test/kotlin/net/thauvin/erik/jokeapi/JokeConfigTest.kt index 4046eac..92de2e0 100644 --- a/src/test/kotlin/net/thauvin/erik/jokeapi/JokeConfigTest.kt +++ b/src/test/kotlin/net/thauvin/erik/jokeapi/JokeConfigTest.kt @@ -41,8 +41,8 @@ import assertk.assertions.isGreaterThanOrEqualTo import assertk.assertions.isTrue import assertk.assertions.prop import assertk.assertions.size -import net.thauvin.erik.jokeapi.JokeApi.getJoke -import net.thauvin.erik.jokeapi.JokeApi.getJokes +import net.thauvin.erik.jokeapi.JokeApi.joke +import net.thauvin.erik.jokeapi.JokeApi.jokes import net.thauvin.erik.jokeapi.JokeApi.getRawJokes import net.thauvin.erik.jokeapi.JokeApi.logger import net.thauvin.erik.jokeapi.models.Category @@ -60,7 +60,7 @@ import kotlin.test.assertContains internal class JokeConfigTest { @Test fun `Get Joke with Default Builder`() { - val joke = getJoke() + val joke = joke() assertThat(joke, "joke").all { prop(Joke::id).isGreaterThanOrEqualTo(0) prop(Joke::lang).isEqualTo(Language.EN) @@ -78,7 +78,7 @@ internal class JokeConfigTest { idRange(IdRange(id - 2, id + 2)) safe(true) }.build() - val joke = getJoke(config) + val joke = joke(config) logger.fine(joke.toString()) assertThat(joke, "config").all { prop(Joke::type).isEqualTo(Type.TWOPART) @@ -98,7 +98,7 @@ internal class JokeConfigTest { idRange(IdRange(id)) splitNewLine(true) }.build() - val joke = getJoke(config) + val joke = joke(config) logger.fine(joke.toString()) assertThat(joke, "config").all { prop(Joke::id).isEqualTo(id) @@ -127,7 +127,7 @@ internal class JokeConfigTest { safe(true) lang(Language.FR) }.build() - val jokes = getJokes(config) + val jokes = jokes(config) assertThat(jokes, "jokes").all { size().isEqualTo(amount) each {