Converted utility classes to objects
This commit is contained in:
parent
b61fed0fa6
commit
2a17c42737
10 changed files with 130 additions and 142 deletions
|
@ -50,121 +50,119 @@ import java.util.stream.Collectors
|
|||
/**
|
||||
* Implements the [Sv443's JokeAPI](https://jokeapi.dev/).
|
||||
*/
|
||||
class JokeApi private constructor() {
|
||||
companion object {
|
||||
private const val API_URL = "https://v2.jokeapi.dev/"
|
||||
object JokeApi {
|
||||
private const val API_URL = "https://v2.jokeapi.dev/"
|
||||
|
||||
@JvmStatic
|
||||
val logger: Logger by lazy { Logger.getLogger(JokeApi::class.java.simpleName) }
|
||||
@JvmStatic
|
||||
val logger: Logger by lazy { Logger.getLogger(JokeApi::class.java.simpleName) }
|
||||
|
||||
/**
|
||||
* Makes a direct API call.
|
||||
*
|
||||
* Sse the [JokeAPI Documentation](https://jokeapi.dev/#endpoints) for more details.
|
||||
*/
|
||||
@JvmStatic
|
||||
@JvmOverloads
|
||||
@Throws(HttpErrorException::class)
|
||||
fun apiCall(
|
||||
endPoint: String,
|
||||
path: String = "",
|
||||
params: Map<String, String> = emptyMap(),
|
||||
auth: String = ""
|
||||
): String {
|
||||
val urlBuilder = StringBuilder("$API_URL$endPoint")
|
||||
/**
|
||||
* Makes a direct API call.
|
||||
*
|
||||
* Sse the [JokeAPI Documentation](https://jokeapi.dev/#endpoints) for more details.
|
||||
*/
|
||||
@JvmStatic
|
||||
@JvmOverloads
|
||||
@Throws(HttpErrorException::class)
|
||||
fun apiCall(
|
||||
endPoint: String,
|
||||
path: String = "",
|
||||
params: Map<String, String> = emptyMap(),
|
||||
auth: String = ""
|
||||
): String {
|
||||
val urlBuilder = StringBuilder("$API_URL$endPoint")
|
||||
|
||||
if (path.isNotEmpty()) {
|
||||
if (!urlBuilder.endsWith(('/'))) {
|
||||
urlBuilder.append('/')
|
||||
}
|
||||
urlBuilder.append(path)
|
||||
if (path.isNotEmpty()) {
|
||||
if (!urlBuilder.endsWith(('/'))) {
|
||||
urlBuilder.append('/')
|
||||
}
|
||||
urlBuilder.append(path)
|
||||
}
|
||||
|
||||
if (params.isNotEmpty()) {
|
||||
urlBuilder.append('?')
|
||||
val it = params.iterator()
|
||||
while (it.hasNext()) {
|
||||
val param = it.next()
|
||||
urlBuilder.append(param.key)
|
||||
if (param.value.isNotEmpty()) {
|
||||
urlBuilder.append("=").append(
|
||||
URLEncoder.encode(param.value, StandardCharsets.UTF_8).replace("+", "%20")
|
||||
.replace("*", "%2A").replace("%7E", "~")
|
||||
)
|
||||
}
|
||||
if (it.hasNext()) {
|
||||
urlBuilder.append("&")
|
||||
}
|
||||
if (params.isNotEmpty()) {
|
||||
urlBuilder.append('?')
|
||||
val it = params.iterator()
|
||||
while (it.hasNext()) {
|
||||
val param = it.next()
|
||||
urlBuilder.append(param.key)
|
||||
if (param.value.isNotEmpty()) {
|
||||
urlBuilder.append("=").append(
|
||||
URLEncoder.encode(param.value, StandardCharsets.UTF_8).replace("+", "%20")
|
||||
.replace("*", "%2A").replace("%7E", "~")
|
||||
)
|
||||
}
|
||||
if (it.hasNext()) {
|
||||
urlBuilder.append("&")
|
||||
}
|
||||
}
|
||||
return fetchUrl(urlBuilder.toString(), auth)
|
||||
}
|
||||
return fetchUrl(urlBuilder.toString(), auth)
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns one or more jokes using a [configuration][JokeConfig].
|
||||
*
|
||||
* See the [JokeAPI Documentation](https://jokeapi.dev/#joke-endpoint) for more details.
|
||||
*/
|
||||
@JvmStatic
|
||||
@Throws(HttpErrorException::class)
|
||||
fun getRawJokes(config: JokeConfig): String {
|
||||
return getRawJokes(
|
||||
categories = config.categories,
|
||||
lang = config.language,
|
||||
blacklistFlags = config.flags,
|
||||
type = config.type,
|
||||
format = config.format,
|
||||
contains = config.contains,
|
||||
idRange = config.idRange,
|
||||
amount = config.amount,
|
||||
safe = config.safe,
|
||||
auth = config.auth
|
||||
)
|
||||
}
|
||||
/**
|
||||
* Returns one or more jokes using a [configuration][JokeConfig].
|
||||
*
|
||||
* See the [JokeAPI Documentation](https://jokeapi.dev/#joke-endpoint) for more details.
|
||||
*/
|
||||
@JvmStatic
|
||||
@Throws(HttpErrorException::class)
|
||||
fun getRawJokes(config: JokeConfig): String {
|
||||
return getRawJokes(
|
||||
categories = config.categories,
|
||||
lang = config.language,
|
||||
blacklistFlags = config.flags,
|
||||
type = config.type,
|
||||
format = config.format,
|
||||
contains = config.contains,
|
||||
idRange = config.idRange,
|
||||
amount = config.amount,
|
||||
safe = config.safe,
|
||||
auth = config.auth
|
||||
)
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve a [Joke] instance using a [configuration][JokeConfig].
|
||||
*
|
||||
* Sse the [JokeAPI Documentation](https://jokeapi.dev/#joke-endpoint) for more details.
|
||||
*/
|
||||
@JvmStatic
|
||||
@JvmOverloads
|
||||
@Throws(HttpErrorException::class, JokeException::class)
|
||||
fun getJoke(config: JokeConfig = JokeConfig.Builder().build()): Joke {
|
||||
return getJoke(
|
||||
categories = config.categories,
|
||||
lang = config.language,
|
||||
blacklistFlags = config.flags,
|
||||
type = config.type,
|
||||
contains = config.contains,
|
||||
idRange = config.idRange,
|
||||
safe = config.safe,
|
||||
auth = config.auth,
|
||||
splitNewLine = config.splitNewLine
|
||||
)
|
||||
}
|
||||
/**
|
||||
* Retrieve a [Joke] instance using a [configuration][JokeConfig].
|
||||
*
|
||||
* Sse the [JokeAPI Documentation](https://jokeapi.dev/#joke-endpoint) for more details.
|
||||
*/
|
||||
@JvmStatic
|
||||
@JvmOverloads
|
||||
@Throws(HttpErrorException::class, JokeException::class)
|
||||
fun getJoke(config: JokeConfig = JokeConfig.Builder().build()): Joke {
|
||||
return getJoke(
|
||||
categories = config.categories,
|
||||
lang = config.language,
|
||||
blacklistFlags = config.flags,
|
||||
type = config.type,
|
||||
contains = config.contains,
|
||||
idRange = config.idRange,
|
||||
safe = config.safe,
|
||||
auth = config.auth,
|
||||
splitNewLine = config.splitNewLine
|
||||
)
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns an array of [Joke] instances using a [configuration][JokeConfig].
|
||||
*
|
||||
* Sse the [JokeAPI Documentation](https://jokeapi.dev/#joke-endpoint) for more details.
|
||||
*/
|
||||
@JvmStatic
|
||||
@Throws(HttpErrorException::class, JokeException::class)
|
||||
fun getJokes(config: JokeConfig): Array<Joke> {
|
||||
return getJokes(
|
||||
categories = config.categories,
|
||||
lang = config.language,
|
||||
blacklistFlags = config.flags,
|
||||
type = config.type,
|
||||
contains = config.contains,
|
||||
idRange = config.idRange,
|
||||
amount = config.amount,
|
||||
safe = config.safe,
|
||||
auth = config.auth,
|
||||
splitNewLine = config.splitNewLine
|
||||
)
|
||||
}
|
||||
/**
|
||||
* Returns an array of [Joke] instances using a [configuration][JokeConfig].
|
||||
*
|
||||
* Sse the [JokeAPI Documentation](https://jokeapi.dev/#joke-endpoint) for more details.
|
||||
*/
|
||||
@JvmStatic
|
||||
@Throws(HttpErrorException::class, JokeException::class)
|
||||
fun getJokes(config: JokeConfig): Array<Joke> {
|
||||
return getJokes(
|
||||
categories = config.categories,
|
||||
lang = config.language,
|
||||
blacklistFlags = config.flags,
|
||||
type = config.type,
|
||||
contains = config.contains,
|
||||
idRange = config.idRange,
|
||||
amount = config.amount,
|
||||
safe = config.safe,
|
||||
auth = config.auth,
|
||||
splitNewLine = config.splitNewLine
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* util.kt
|
||||
* JokeUtil.kt
|
||||
*
|
||||
* Copyright 2022-2023 Erik C. Thauvin (erik@thauvin.net)
|
||||
*
|
||||
|
@ -29,6 +29,8 @@
|
|||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
@file:JvmName("JokeUtil")
|
||||
|
||||
package net.thauvin.erik.jokeapi
|
||||
|
||||
import net.thauvin.erik.jokeapi.exceptions.HttpErrorException
|
||||
|
@ -52,14 +54,14 @@ internal fun fetchUrl(url: String, auth: String = ""): String {
|
|||
|
||||
val connection = URL(url).openConnection() as HttpURLConnection
|
||||
connection.setRequestProperty(
|
||||
"User-Agent", "Mozilla/5.0 (Linux x86_64; rv:105.0) Gecko/20100101 Firefox/105.0"
|
||||
"User-Agent", "Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/109.0"
|
||||
)
|
||||
if (auth.isNotEmpty()) {
|
||||
connection.setRequestProperty("Authentication", auth)
|
||||
}
|
||||
|
||||
if (connection.responseCode in 200..399) {
|
||||
val body = connection.inputStream.bufferedReader().readText()
|
||||
val body = connection.inputStream.bufferedReader().use { it.readText() }
|
||||
if (JokeApi.logger.isLoggable(Level.FINE)) {
|
||||
JokeApi.logger.fine(body)
|
||||
}
|
|
@ -34,7 +34,7 @@ package net.thauvin.erik.jokeapi
|
|||
import assertk.assertThat
|
||||
import assertk.assertions.isGreaterThan
|
||||
import assertk.assertions.startsWith
|
||||
import net.thauvin.erik.jokeapi.JokeApi.Companion.apiCall
|
||||
import net.thauvin.erik.jokeapi.JokeApi.apiCall
|
||||
import net.thauvin.erik.jokeapi.models.Format
|
||||
import net.thauvin.erik.jokeapi.models.Parameter
|
||||
import org.json.JSONObject
|
||||
|
|
|
@ -43,7 +43,7 @@ import assertk.assertions.isNull
|
|||
import assertk.assertions.prop
|
||||
import assertk.assertions.size
|
||||
import assertk.assertions.startsWith
|
||||
import net.thauvin.erik.jokeapi.JokeApi.Companion.logger
|
||||
import net.thauvin.erik.jokeapi.JokeApi.logger
|
||||
import net.thauvin.erik.jokeapi.exceptions.HttpErrorException
|
||||
import net.thauvin.erik.jokeapi.exceptions.JokeException
|
||||
import net.thauvin.erik.jokeapi.models.Category
|
||||
|
|
|
@ -48,7 +48,7 @@ import assertk.assertions.isNotNull
|
|||
import assertk.assertions.isTrue
|
||||
import assertk.assertions.prop
|
||||
import assertk.assertions.size
|
||||
import net.thauvin.erik.jokeapi.JokeApi.Companion.logger
|
||||
import net.thauvin.erik.jokeapi.JokeApi.logger
|
||||
import net.thauvin.erik.jokeapi.exceptions.JokeException
|
||||
import net.thauvin.erik.jokeapi.models.Category
|
||||
import net.thauvin.erik.jokeapi.models.Flag
|
||||
|
|
|
@ -41,10 +41,10 @@ import assertk.assertions.isGreaterThanOrEqualTo
|
|||
import assertk.assertions.isTrue
|
||||
import assertk.assertions.prop
|
||||
import assertk.assertions.size
|
||||
import net.thauvin.erik.jokeapi.JokeApi.Companion.getJoke
|
||||
import net.thauvin.erik.jokeapi.JokeApi.Companion.getJokes
|
||||
import net.thauvin.erik.jokeapi.JokeApi.Companion.getRawJokes
|
||||
import net.thauvin.erik.jokeapi.JokeApi.Companion.logger
|
||||
import net.thauvin.erik.jokeapi.JokeApi.getJoke
|
||||
import net.thauvin.erik.jokeapi.JokeApi.getJokes
|
||||
import net.thauvin.erik.jokeapi.JokeApi.getRawJokes
|
||||
import net.thauvin.erik.jokeapi.JokeApi.logger
|
||||
import net.thauvin.erik.jokeapi.models.Category
|
||||
import net.thauvin.erik.jokeapi.models.Flag
|
||||
import net.thauvin.erik.jokeapi.models.Format
|
||||
|
|
|
@ -40,7 +40,7 @@ import org.junit.jupiter.api.assertThrows
|
|||
import org.junit.jupiter.api.extension.ExtendWith
|
||||
|
||||
@ExtendWith(BeforeAllTests::class)
|
||||
internal class UtilTest {
|
||||
internal class JokeUtilTest {
|
||||
@Test
|
||||
fun `Invalid JSON Error`() {
|
||||
assertThrows<JSONException> { parseError(JSONObject("{}")) }
|
Loading…
Add table
Add a link
Reference in a new issue