Best Fuel code snippet using com.github.kittinunf.fuel.core.extensions.Formatting
ADocTagAspect.kt
Source:ADocTagAspect.kt
1package hal.spel.aspect2import com.fasterxml.jackson.databind.ObjectMapper3import com.github.kittinunf.fuel.core.Headers4import com.github.kittinunf.fuel.core.Method5import com.github.kittinunf.fuel.core.extensions.cUrlString6import com.github.kittinunf.fuel.core.requests.RepeatableBody7import hal.spel.Answer8import hal.spel.Link9import io.micronaut.http.HttpStatus10import java.io.PrintWriter11import kotlin.math.min12private val jackson = ObjectMapper()13private var counters = mutableMapOf<String, Int>()14private var relation: String? = null15/**16 * Reports the parts of the request and response as AsciiDoctor tags.17 *18 * Using this class the client application can produce the AsciiDoctor document containing19 * tags for all requests/responses application communicates with the server. Then that tags can be included20 * in a separate AsciiDoctor document built by AsciiDoctor plugin into final documentation including21 * "life" data.22 * Different instances of this class can report on different set of parts related to communication23 * with server. For example24 *25 * @param reporter -- the PrintWriter to print the text of the tag into. Could be File, Console or other Writer26 * @param parts -- the vararg of parts to include as tags27 * @param followed -- the AspectFormatter to link in the chain.28 * The Aspect generated by this Formatter will pass control to the aspect generated by this parameter29 */30class ADocTagFormatter(31 private val reporter: PrintWriter,32 vararg val parts: ReportPart,33 followed: AspectFormatter? = null34) : AspectFormatter(followed) {35 private val aDocTagFormatter = mutableMapOf<ReportPart, Pair<LinkFun?, AnswerFun?>>().also {36 ReportPart.values().forEach { part ->37 it[part] = Pair<LinkFun?, AnswerFun?>({38 preADocTagFormatter[part]?.invoke(this, reporter::println)39 this40 }, {41 postADocTagFormatter[part]?.invoke(it, reporter::println)42 })43 }44 }45 override fun makeAspect(aspect: Aspect?): Aspect {46 return makeReporterAspect(aDocTagFormatter, *parts, aspect = super.makeAspect(aspect))47 }48}49private fun <T> formatTag(tagName: String, obj: T?, reporter: (String) -> Unit) {50 reporter("""51 |#tag::$relation-$tagName-${counters[relation]}[]52 |${53 when (obj) {54 is Map<*, *> -> obj.filterValues {55 it != null56 }.map { (key, value) ->57 "$key:\t$value"58 }.joinToString("\n|\t", "\t")59 is Collection<*> -> obj.joinToString("\n|\t", "\t")60 else -> obj ?: ""61 }62 }63 |#end::$relation-$tagName-${counters[relation]}[]64 """.trimMargin()65 )66}67/**68 * AsciiDoc preRequest aspect definitions69 *70 * This Map defines the aspect making functions for different parts of [Link] object.71 *72 * The maker for [PRE_PARTS.REL] keeps track of similar requests and assigns unique number to make an AsciiDoc tag unique.73 * If this aspect won't be included in an aspect chain the [null] will be used instead of numbers and all segments74 * of AsciiDoc will have identical tags. It is recommended to always include [PRE_PARTS.REL] aspect even if the75 * corresponding segment won't be used in the final documentation.76 *77 *78 */79private val preADocTagFormatter = mapOf<ReportPart, (Link, (String) -> Unit) -> Link>(80 ReportPart.REL to { link, reporter ->81 // Assign next available number to make a unique AsciiDoc tag82 relation = link.rel?.apply {83 counters[this] = counters[this]?.let {84 it + 185 } ?: 186 }87 formatTag("ref", link.rel, reporter)88 link89 },90 ReportPart.LINK to { link, reporter ->91 formatTag("link", link.toMap(), reporter)92 link93 },94 ReportPart.URI to { link, reporter ->95 formatTag("URI", link.href, reporter)96 link97 },98 ReportPart.NAME to { link, reporter ->99 formatTag("name", link.name, reporter)100 link101 },102 ReportPart.TITLE to { link, reporter ->103 formatTag("title", link.title, reporter)104 link105 },106 ReportPart.TYPE to { link, reporter ->107 formatTag("type", link.type, reporter)108 link109 }110)111/**112 * AsciiDoc postRequest aspect definitions113 *114 * This Map defines the aspect making functions for different parts of [Answer] object.115 *116 */117private val postADocTagFormatter = mapOf<ReportPart, (Answer, (String) -> Unit) -> Unit>(118 ReportPart.URL to { answer, reporter ->119 formatTag("URL", answer.response.url.toString(), reporter)120 },121 ReportPart.CURL to { answer, reporter ->122 formatTag(123 "curl", answer.request.cUrlString()124 .replace(" -H", "\\\n -H")125 .replace(Regex(" (https?://.*)"), "\\\\\n \"$1\""), reporter126 )127 },128 ReportPart.HEADERS_OUT to { answer, reporter ->129 formatTag("headerOut", answer.request.headers, reporter)130 },131 ReportPart.COOKIES_OUT to { answer, reporter ->132 formatTag("cookieOut", answer.request["Set-Cookies"], reporter)133 },134 ReportPart.BODY_OUT to { answer, reporter ->135 if (answer.request.method in setOf(136 Method.POST,137 Method.PUT,138 Method.PATCH139 ) && !answer.request.body.isConsumed()140 ) {141 formatTag(142 "bodyOut",143 if (answer.request.body.isConsumed()) {144 "Length of the sent Body: ${answer.request.body.length}"145 } else {146 if (answer.request.header(Headers.CONTENT_TYPE).any { it.contains("json") }) {147 jackson.writerWithDefaultPrettyPrinter().writeValueAsString(answer.body?.invoke())148 } else {149 answer.request.body.asString(null)150 }151 }, reporter152 )153 } else {154 formatTag("bodyOut", "*** Cannot report body sent out ***", reporter)155 }156 },157 ReportPart.STATUS to { answer, reporter ->158 formatTag("status", "${answer.status.code} (${answer.status})", reporter)159 },160 ReportPart.HEADERS_IN to { answer, reporter ->161 formatTag("headersIn", answer.response.headers, reporter)162 },163 ReportPart.COOKIES_IN to { answer, reporter ->164 formatTag("cookiesIn", answer.response["Cookies"], reporter)165 },166 ReportPart.BODY_IN to { answer, reporter ->167 formatTag(168 "bodyIn",169 when (answer.status.code) {170 HttpStatus.FOUND.code -> "Redirection to: ${answer.response.header("Location").first()}"171 else ->172 if (answer.response.header(Headers.CONTENT_TYPE).any { it.contains("json") }) {173 jackson.writerWithDefaultPrettyPrinter().writeValueAsString(answer.body?.invoke())174 } else {175 val head = min(answer.response.contentLength, UNSTRUCTURED_HEAD_LENGTH)176 """ (length: ${answer.response.contentLength})177 |${String(answer.response.data).substring(0, head.toInt())}178 """.trimMargin()179 }180 }, reporter181 )182 }183)184/**185 * Factory function to create an aspect function to be called before sending HTTP request.186 *187 * The aspect created by this factory will call @reporter function for the string generated by the function in the map.188 * The function in the map formatting the corresponding part of the Link as an AsciiDocument tag and @reporter189 * will write that text into the stream, which may be associated with file or console.190 *191 * @param reporter -- function to record the formatted tag String192 * @param parts -- a vararg array of the parts to report on193 * @param aspect -- another aspect to chain to after executing this194 */195fun makePreADocTagAspect(reporter: (String) -> Unit, vararg parts: ReportPart, aspect: Aspect? = null): Aspect {196 return makePreReporterAspect(reporter, preADocTagFormatter, *parts, aspect = aspect)197}198/**199 * Factory function to create an aspect function to be called after sending HTTP request.200 *201 * The aspect created by this factory will call @reporter function for the string generated by the function in the map.202 * The function in the map formatting the corresponding part of the Answer as an AsciiDocument tag and @reporter203 * will write that text into the stream, which may be associated with file or console.204 *205 * @param reporter -- function to record the formatted tag String206 * @param parts -- a vararg array of the parts to report on207 * @param aspect -- another aspect to chain to after executing this208 */209fun makePostADocTagAspect(reporter: (String) -> Unit, vararg parts: ReportPart, aspect: Aspect? = null): Aspect {210 return makePostReporterAspect(reporter, postADocTagFormatter, *parts, aspect = aspect)211}...
LoggerAspect.kt
Source:LoggerAspect.kt
1package hal.spel.aspect2import com.fasterxml.jackson.databind.ObjectMapper3import com.github.kittinunf.fuel.core.Headers4import com.github.kittinunf.fuel.core.Method5import com.github.kittinunf.fuel.core.extensions.cUrlString6import hal.spel.Answer7import hal.spel.Link8import io.micronaut.http.HttpStatus9import kotlin.math.min10const val UNSTRUCTURED_HEAD_LENGTH = 100L11private val jackson = ObjectMapper()12/**13 * Reports the parts of the request and response in the log.14 *15 * Using this class the client application can log all HTTP requests/responses.16 *17 * Different instances of this class can log at different level their own set of HTTP requests/responses parts.18 *19 * For example:20 * <code>21 * LoggerFormatter(logger::info, ReportPart.REL, ReportPart.status22 * , followed = LoggerFormatter(logger::debug, ReportPart.URL, ReportPart.HEADERS_OUT)23 * )24 * </code>25 *26 * @param reporter -- the simple function to log the logging message.27 * @param parts -- the vararg of parts to include as tags28 * @param followed -- the AspectFormatter to link in the chain.29 * The Aspect generated by this Formatter will pass control to the aspect generated by this parameter30 */31class LoggerFormatter(32 private val reporter: (String) -> Unit,33 vararg val parts: ReportPart,34 followed: AspectFormatter? = null35) : AspectFormatter(followed) {36 private val loggerFormatter: Map<ReportPart, Pair<LinkFun?, AnswerFun?>> =37 mutableMapOf<ReportPart, Pair<LinkFun?, AnswerFun?>>().also {38 ReportPart.values().forEach { part ->39 it[part] = Pair<LinkFun?, AnswerFun?>({40 preLoggerFormatter[part]?.invoke(this, reporter)41 this42 }, {43 postLoggerFormatter[part]?.invoke(it, reporter)44 })45 }46 }47 override fun makeAspect(aspect: Aspect?): Aspect {48 return makeReporterAspect(loggerFormatter, *parts, aspect = super.makeAspect(aspect))49 }50}51private val preLoggerFormatter = mapOf<ReportPart, (Link, (String) -> Unit) -> Link>(52 ReportPart.REL to { link, reporter ->53 reporter(">>> ${link.rel} <<<")54 link55 },56 ReportPart.LINK to { link, reporter ->57 reporter(58 if (link.name.isNullOrBlank()) {59 "Link href: ${link.href}"60 } else {61 "Link name: ${link.name} (${link.href})"62 }63 )64 link65 },66 ReportPart.URI to { link, reporter -> reporter("URL: ${link.href}"); link },67 ReportPart.NAME to { link, reporter -> reporter("Named: ${link.name}"); link },68 ReportPart.TITLE to { link, reporter -> reporter("Titled: ${link.title}"); link },69 ReportPart.TYPE to { link, reporter -> reporter("Accept: ${link.type}"); link }70)71private val postLoggerFormatter = mapOf<ReportPart, (Answer, (String) -> Unit) -> Unit>(72 ReportPart.URL to { answer, reporter -> reporter("Resource Location: ${answer.response.url}") },73 ReportPart.CURL to { answer, reporter ->74 if (!(answer.request.method in setOf(75 Method.POST,76 Method.PUT,77 Method.PATCH78 ) && answer.request.body.isConsumed())79 ) {80 reporter("$> ${answer.request.cUrlString()}")81 } else {82 reporter("*** Cannot report curl ***")83 }84 },85 ReportPart.HEADERS_OUT to { answer, reporter ->86 reporter(87 "Header sent: ${88 answer.request.headers.map { (key, value) ->89 "\t$key:\t${value.joinToString("\n\t\t")}"90 }.joinToString("\n", "\n")91 }"92 )93 },94 ReportPart.COOKIES_OUT to { answer, reporter ->95 reporter("Cookies sent: ${answer.request["Set-Cookies"].joinToString("\n\t", "\n\t")}")96 },97 ReportPart.BODY_OUT to { answer, reporter ->98 if (answer.request.method in setOf(99 Method.POST,100 Method.PUT,101 Method.PATCH102 ) && !answer.request.body.isConsumed()103 ) {104 reporter(105 if (answer.request.body.isConsumed()) {106 "Length of the sent Body: ${answer.request.body.length}"107 } else {108 "Body sent:\n${109 if (answer.request.header(Headers.CONTENT_TYPE).any { it.contains("json") }) {110 jackson.writerWithDefaultPrettyPrinter().writeValueAsString(answer.body?.invoke())111 } else {112 answer.request.body.asString(null)113 }114 }"115 }116 )117 } else {118 reporter("*** Cannot report body sent ***")119 }120 },121 ReportPart.STATUS to { answer, reporter -> reporter("Status: ${answer.status.code} (${answer.status})") },122 ReportPart.HEADERS_IN to { answer, reporter ->123 reporter(124 "Headers received: ${125 answer.response.headers.map { (key, value) ->126 "\t$key:\t${value.joinToString("\n\t\t")}"127 }.joinToString("\n", "\n")128 }"129 )130 },131 ReportPart.COOKIES_IN to { answer, reporter ->132 reporter("Cookies received: ${answer.response["Cookies"].joinToString("\n\t", "\n\t")}")133 },134 ReportPart.BODY_IN to { answer, reporter ->135 reporter(136 "Body received:${137 when (answer.status.code) {138 HttpStatus.FOUND.code -> "Redirection to: ${answer.response.header("Location").first()}"139 else ->140 if (answer.response.header(Headers.CONTENT_TYPE).any { it.contains("json") }) {141 "\n${jackson.writerWithDefaultPrettyPrinter().writeValueAsString(answer.body?.invoke())}"142 } else {143 val head = min(answer.response.contentLength, UNSTRUCTURED_HEAD_LENGTH)144 " (length: ${answer.response.contentLength})\n${145 String(answer.response.data).substring(146 0,147 head.toInt()148 )149 }"150 }151 }152 }"153 )154 }155)156/**157 * Factory function to create an aspect function to be called before sending HTTP request.158 *159 * The aspect created by this factory will call @reporter function for the string generated by the function in the map.160 * The function in the map formatting the corresponding part of the Link as an message for logger and @reporter161 * will call logger method with some level to log that message.162 *163 * @param reporter -- function to record the formatted tag String164 * @param parts -- a vararg array of the parts to report on165 * @param aspect -- another aspect to chain to after executing this166 */167fun makePreLoggerAspect(reporter: (String) -> Unit, vararg parts: ReportPart, aspect: Aspect? = null): Aspect {168 return makePreReporterAspect(reporter, preLoggerFormatter, *parts, aspect = aspect)169}170/**171 * Factory function to create an aspect function to be called after sending HTTP request.172 *173 * The aspect created by this factory will call @reporter function for the string generated by the function in the map.174 * The function in the map formatting the corresponding part of the Answer as an message for logger and @reporter175 * will call logger method with some level to log that message.176 *177 * @param reporter -- function to record the formatted tag String178 * @param parts -- a vararg array of the parts to report on179 * @param aspect -- another aspect to chain to after executing this180 */181fun makePostLoggerAspect(reporter: (String) -> Unit, vararg parts: ReportPart, aspect: Aspect? = null): Aspect {182 return makePostReporterAspect(reporter, postLoggerFormatter, *parts, aspect = aspect)183}...
build.gradle.kts
Source:build.gradle.kts
1import org.jetbrains.dokka.gradle.DokkaTask2import org.jetbrains.kotlin.gradle.tasks.KotlinCompile3import org.jlleitschuh.gradle.ktlint.reporter.ReporterType4plugins {5 kotlin("jvm") version "1.4.10"6 kotlin("plugin.serialization") version "1.4.10"7 id("io.qameta.allure") version "2.8.1"8 id("org.jetbrains.dokka") version "0.10.1"9 id("com.adarshr.test-logger") version "2.1.1"10 id("io.gitlab.arturbosch.detekt") version "1.14.2"11 id("org.jlleitschuh.gradle.ktlint") version "9.4.1"12 id("com.github.ben-manes.versions") version "0.36.0"13 id("se.patrikerdes.use-latest-versions") version "0.2.15"14}15allprojects {16 apply(plugin = "io.qameta.allure")17 apply(plugin = "org.jetbrains.dokka")18 apply(plugin = "com.adarshr.test-logger")19 apply(plugin = "org.jetbrains.kotlin.jvm")20 apply(plugin = "io.gitlab.arturbosch.detekt")21 apply(plugin = "org.jlleitschuh.gradle.ktlint")22 apply(plugin = "com.github.ben-manes.versions")23 apply(plugin = "se.patrikerdes.use-latest-versions")24 apply(plugin = "org.jetbrains.kotlin.plugin.serialization")25 group = "ee.found"26 version = "1.0-SNAPSHOT"27 val fuelVersion = "2.3.0"28 val kotestVersion = "4.3.1"29 val allureVersion = "2.13.6"30 val aspectJVersion = "1.9.6"31 val exposedVersion = "0.28.1"32 val selenideVercion = "5.20.4"33 //region Settings34 val compileKotlin: KotlinCompile by tasks35 compileKotlin.kotlinOptions {36 jvmTarget = "11"37 }38 val compileTestKotlin: KotlinCompile by tasks39 compileTestKotlin.kotlinOptions {40 jvmTarget = "11"41 }42 //region Dokka43 // https://github.com/Kotlin/dokka44 // https://kotlinlang.org/docs/reference/kotlin-doc.html45 tasks.withType<DokkaTask> {46 outputFormat = "html"47 outputDirectory = "$buildDir/dokka"48 subProjects = subprojects.map { it.name }49 configuration {50 reportUndocumented = true51 }52 }53 //endregion54 //region Detekt55 detekt {56 input = files("src/main/kotlin", "src/test/kotlin")57 }58 //endregion59 //region Ktlint60 ktlint {61 verbose.set(true)62 outputToConsole.set(true)63 outputColorName.set("RED")64 reporters {65 reporter(ReporterType.PLAIN)66 }67 }68 //endregion69 //region Allure70 allure {71 version = allureVersion72 aspectjweaver = true73 aspectjVersion = aspectJVersion74 useJUnit5 {75 version = allureVersion76 }77 }78 //endregion79 //region Tests80 tasks.withType<Test> {81 testlogger {82 setTheme("mocha-parallel")83 }84 useJUnitPlatform()85 systemProperty("junit.jupiter.testinstance.lifecycle.default", "per_class")86 systemProperty("junit.jupiter.execution.parallel.enabled", "true")87 systemProperty("junit.jupiter.execution.parallel.mode.default", "same_thread")88 systemProperty("junit.jupiter.extensions.autodetection.enabled", "true")89 systemProperty("junit.jupiter.execution.parallel.config.strategy", "dynamic")90 systemProperty("junit.jupiter.execution.parallel.mode.classes.default", "same_thread")91 }92 //endregion93 //endregion94 repositories {95 jcenter()96 mavenCentral()97 maven(url = "https://kotlin.bintray.com/kotlinx/") // soon will be just jcenter()98 }99 dependencies {100 implementation(kotlin("stdlib"))101 implementation(group = "io.qameta.allure", name = "allure-junit5", version = "2.13.5")102 detektPlugins(group = "io.gitlab.arturbosch.detekt", name = "detekt-formatting", version = "1.14.2")103 implementation(group = "org.litote.kmongo", name = "kmongo", version = "4.2.0")104 implementation(group = "com.google.code.gson", name = "gson", version = "2.8.6")105 implementation(group = "com.charleskorn.kaml", name = "kaml", version = "0.26.0")106 implementation(group = "org.postgresql", name = "postgresql", version = "42.2.18")107 implementation(group = "com.ecwid.consul", name = "consul-api", version = "1.4.5")108 implementation(group = "org.awaitility", name = "awaitility-kotlin", version = "4.0.3")109 implementation(group = "io.github.microutils", name = "kotlin-logging", version = "2.0.3")110 implementation(group = "org.jetbrains.kotlinx", name = "kotlinx-datetime", version = "0.1.0")111 implementation(group = "org.jetbrains.kotlinx", name = "kotlinx-serialization-runtime", version = "+")112 implementation(group = "com.github.mifmif", name = "generex", version = "1.0.2")113 implementation(group = "com.fasterxml.jackson.module", name = "jackson-module-kotlin", version = "2.11.+")114 implementation(group = "com.github.vertical-blank", name = "sql-formatter", version = "1.0.3")115 // Kotest116 implementation(group = "io.kotest", name = "kotest-assertions-core", version = kotestVersion)117 // AspectJ118 implementation(group = "org.aspectj", name = "aspectjrt", version = aspectJVersion)119 implementation(group = "org.aspectj", name = "aspectjweaver", version = aspectJVersion)120 // JUnit121 implementation(platform("org.junit:junit-bom:5.7.0"))122 implementation(group = "org.junit.jupiter", name = "junit-jupiter")123 // Fuel124 implementation(group = "com.github.kittinunf.fuel", name = "fuel", version = fuelVersion)125 implementation(group = "com.github.kittinunf.fuel", name = "fuel-jackson", version = fuelVersion)126 implementation(group = "com.github.kittinunf.fuel", name = "fuel-kotlinx-serialization", version = fuelVersion)127 // Exposed128 implementation(group = "org.jetbrains.exposed", name = "exposed-dao", version = exposedVersion)129 implementation(group = "org.jetbrains.exposed", name = "exposed-core", version = exposedVersion)130 implementation(group = "org.jetbrains.exposed", name = "exposed-jdbc", version = exposedVersion)131 implementation(group = "org.jetbrains.exposed", name = "exposed-jodatime", version = exposedVersion)132 // Selenide133 implementation(group = "com.codeborne", name = "selenide", version = selenideVercion)134 }135}136tasks.test {137 onlyIf { false }138}139tasks.register("uitest", org.gradle.api.tasks.testing.Test::class) {140 description =141 "Runs browser tests. Pass -Dconfiguration=local to select target test stand. Possible values: local"142 include("ee/found/uitests/*Test.class")143 bypassSystemPropertiesToTest()144 outputs.upToDateWhen { false }145}146fun Test.bypassSystemPropertiesToTest() {147 systemProperties(System.getProperties().mapKeys { it.key as String })148}...
common-library.gradle.kts
Source:common-library.gradle.kts
1import io.gitlab.arturbosch.detekt.detekt2import org.jetbrains.kotlin.gradle.tasks.KotlinCompile3plugins {4 kotlin("jvm")5 kotlin("kapt")6 id("io.gitlab.arturbosch.detekt")7 id("org.jetbrains.dokka")8 jacoco9}10repositories {11 mavenCentral()12 jcenter()13}14apply {15 from("${rootProject.rootDir}/properties.gradle.kts")16}17val ktlint: Configuration = configurations.create("ktlint")18val kotlinVersion: String by extra19val mockkVersion: String by extra20val kotlinTestVersion: String by extra21val arrowVersion: String by extra22val ktlintVersion: String by extra23val fuelVersion: String by extra24val arrowCoreExtVersion: String by extra25val jacksonVersion: String by extra26val commonsLangVersion: String by extra27dependencies {28 api(kotlin("stdlib-jdk8", kotlinVersion))29 api(kotlin("stdlib-jdk7", kotlinVersion))30 api(kotlin("stdlib", kotlinVersion))31 api(kotlin("reflect", kotlinVersion))32 implementation("com.github.kittinunf.fuel:fuel:$fuelVersion")33 implementation("com.github.kittinunf.fuel:fuel-jackson:$fuelVersion")34 api("com.fasterxml.jackson.module:jackson-module-kotlin:$jacksonVersion")35 api("io.arrow-kt:arrow-core:$arrowVersion")36 api("io.arrow-kt:arrow-core-extensions:$arrowCoreExtVersion")37 testImplementation("io.mockk:mockk:$mockkVersion")38 testImplementation("io.kotlintest:kotlintest-runner-junit5:$kotlinTestVersion")39 testImplementation("io.kotlintest:kotlintest-assertions:$kotlinTestVersion")40 testImplementation("io.kotlintest:kotlintest-assertions-arrow:$kotlinTestVersion")41 testImplementation("org.apache.commons:commons-lang3:$commonsLangVersion")42 testImplementation(gradleTestKit())43 ktlint("com.github.shyiko:ktlint:$ktlintVersion")44}45tasks {46 withType<KotlinCompile> {47 kotlinOptions {48 jvmTarget = JavaVersion.VERSION_1_8.toString()49 freeCompilerArgs = freeCompilerArgs + listOf(50 "-java-parameters",51 "-Xjsr305=strict",52 "-progressive")53 }54 }55 val ktlint by creating(JavaExec::class) {56 group = "verification"57 description = "Check Kotlin code style."58 classpath = configurations["ktlint"]59 main = "com.github.shyiko.ktlint.Main"60 args = listOf("src/**/*.kt")61 }62 "check" {63 dependsOn(ktlint)64 }65 create("ktlintFormat", JavaExec::class) {66 group = "formatting"67 description = "Fix Kotlin code style deviations."68 classpath = configurations["ktlint"]69 main = "com.github.shyiko.ktlint.Main"70 args = listOf("-F", "src/**/*.kt")71 }72 withType<Test> {73 useJUnitPlatform()74 }75}76val detektVersion: String by project77detekt {78 toolVersion = detektVersion79 input = files("$rootDir/src/main/kotlin")80 config = files("$rootDir/detekt-config.yml")81 filters = ".*/resources/.*,.*/build/.*"82}...
FormattingTest.kt
Source:FormattingTest.kt
...5import org.hamcrest.CoreMatchers6import org.hamcrest.MatcherAssert7import org.junit.Test8import java.net.URL9class FormattingTest {10 @Test11 fun httpGetCurlString() {12 val request = DefaultRequest(13 method = Method.GET,14 url = URL("http://httpbin.org/get"),15 headers = Headers.from("Authentication" to "Bearer xxx"),16 parameters = listOf("foo" to "xxx")17 )18 MatcherAssert.assertThat(request.cUrlString(), CoreMatchers.equalTo("curl -i -H \"Authentication:Bearer xxx\" http://httpbin.org/get"))19 }20 @Test21 fun httpPostCurlString() {22 val request = DefaultRequest(23 method = Method.POST,...
Formatting
Using AI Code Generation
1FuelManager.instance.baseHeaders = mapOf("Content-Type" to "application/json")2val (request, response, result) = Fuel.get("/users/kittinunf/repos").responseObject<List<Repository>>()3FuelManager.instance.baseHeaders = mapOf("Content-Type" to "application/json")4val (request, response, result) = Fuel.get("/users/kittinunf/repos").responseObject<List<Repository>>(gsonDeserializerOf())5FuelManager.instance.baseHeaders = mapOf("Content-Type" to "application/json")6val (request, response, result) = Fuel.get("/users/kittinunf/repos").responseObject<List<Repository>>(jacksonDeserializerOf())7FuelManager.instance.baseHeaders = mapOf("Content-Type" to "application/json")8val (request, response, result) = Fuel.get("/users/kittinunf/repos").responseObject<List<Repository>>(moshiDeserializerOf())9FuelManager.instance.baseHeaders = mapOf("Content-Type" to "application/xml")10val (request, response, result) = Fuel.get("/users/kittinunf/repos").responseObject<List<Repository>>(simpleXmlDeserializerOf())11FuelManager.instance.baseHeaders = mapOf("Content-Type" to "application/xml")12val (request, response, result) = Fuel.get("/users/kittinunf/repos").responseObject<List<Repository>>(xmlDeserializerOf())13FuelManager.instance.baseHeaders = mapOf("Content-Type" to "application/xml")14val (request, response, result) = Fuel.get("/users/kittinunf/repos").responseObject<List<Repository>>(xmlDeserializerOf())
Formatting
Using AI Code Generation
1val (data, error) = result2data?.let { println(it) }3error?.let { println(it) }4val (data, error) = result5data?.let { println(it) }6error?.let { println(it) }7val (data, error) = result8data?.let { println(it) }9error?.let { println(it) }10val (data, error) = result11data?.let { println(it) }12error?.let { println(it) }13val (data, error) = result14data?.let { println(it) }15error?.let { println(it) }16val (data, error) = result17data?.let { println(it) }18error?.let { println(it) }19val (data, error) = result20data?.let { println(it) }21error?.let { println(it) }22val (data, error) =
Formatting
Using AI Code Generation
1 .responseString()2 println(request)3 println(response)4 println(result.get())5 println("Hello, World!")6 }7}8{9 "args": {}, 10 "headers": {11 },
Formatting
Using AI Code Generation
1val (data, error) = result2if (data != null) {3 println(Formatting.prettyPrint(data))4}5dependencies {6}
Formatting
Using AI Code Generation
1var stringResponse = result.get()2var stringResponse = result.component1()3var stringResponse = result.component2()4var stringResponse = result.component3()5var stringResponse = result.get()6var stringResponse = result.component1()7var stringResponse = result.component2()8var stringResponse = result.component3()9var stringResponse = result.get()10var stringResponse = result.component1()11var stringResponse = result.component2()12var stringResponse = result.component3()13var stringResponse = result.get()14var stringResponse = result.component1()15var stringResponse = result.component2()16var stringResponse = result.component3()17var stringResponse = result.get()18var stringResponse = result.component1()19var stringResponse = result.component2()20var stringResponse = result.component3()21var stringResponse = result.get()22var stringResponse = result.component1()23var stringResponse = result.component2()24var stringResponse = result.component3()25var stringResponse = result.get()26var stringResponse = result.component1()
Learn to execute automation testing from scratch with LambdaTest Learning Hub. Right from setting up the prerequisites to run your first automation test, to following best practices and diving deeper into advanced test scenarios. LambdaTest Learning Hubs compile a list of step-by-step guides to help you be proficient with different test automation frameworks i.e. Selenium, Cypress, TestNG etc.
You could also refer to video tutorials over LambdaTest YouTube channel to get step by step demonstration from industry experts.
Get 100 minutes of automation test minutes FREE!!