Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Kotlin client] Improve JSON parser #2981

Merged
merged 2 commits into from
May 24, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -166,14 +166,14 @@ public AbstractKotlinCodegen() {
typeMapping.put("ByteArray", "kotlin.ByteArray");
typeMapping.put("number", "java.math.BigDecimal");
typeMapping.put("date-time", "java.time.LocalDateTime");
typeMapping.put("date", "java.time.LocalDateTime");
typeMapping.put("date", "java.time.LocalDate");
typeMapping.put("file", "java.io.File");
typeMapping.put("array", "kotlin.Array");
typeMapping.put("list", "kotlin.collections.List");
typeMapping.put("map", "kotlin.collections.Map");
typeMapping.put("object", "kotlin.Any");
typeMapping.put("binary", "kotlin.Array<kotlin.Byte>");
typeMapping.put("Date", "java.time.LocalDateTime");
typeMapping.put("Date", "java.time.LocalDate");
typeMapping.put("DateTime", "java.time.LocalDateTime");

instantiationTypes.put("array", "kotlin.arrayOf");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -131,6 +131,7 @@ public void processOpts() {
typeMapping.put("DateTime", "LocalDateTime");
importMapping.put("LocalDate", "org.threeten.bp.LocalDate");
importMapping.put("LocalDateTime", "org.threeten.bp.LocalDateTime");
defaultIncludes.add("org.threeten.bp.LocalDate");
defaultIncludes.add("org.threeten.bp.LocalDateTime");
} else if (DateLibrary.STRING.value.equals(dateLibrary)) {
typeMapping.put("date-time", "kotlin.String");
Expand Down Expand Up @@ -166,5 +167,8 @@ public void processOpts() {
supportingFiles.add(new SupportingFile("infrastructure/Serializer.kt.mustache", infrastructureFolder, "Serializer.kt"));
supportingFiles.add(new SupportingFile("infrastructure/Errors.kt.mustache", infrastructureFolder, "Errors.kt"));
supportingFiles.add(new SupportingFile("infrastructure/ByteArrayAdapter.kt.mustache", infrastructureFolder, "ByteArrayAdapter.kt"));
supportingFiles.add(new SupportingFile("infrastructure/LocalDateAdapter.kt.mustache", infrastructureFolder, "LocalDateAdapter.kt"));
supportingFiles.add(new SupportingFile("infrastructure/LocalDateTimeAdapter.kt.mustache", infrastructureFolder, "LocalDateTimeAdapter.kt"));
supportingFiles.add(new SupportingFile("infrastructure/UUIDAdapter.kt.mustache", infrastructureFolder, "UUIDAdapter.kt"));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,6 @@ import {{packageName}}.infrastructure.RequestMethod
import {{packageName}}.infrastructure.ResponseType
import {{packageName}}.infrastructure.Success
import {{packageName}}.infrastructure.toMultiValue
{{#threetenbp}}
import org.threeten.bp.LocalDateTime
{{/threetenbp}}

{{#operations}}
class {{classname}}(basePath: kotlin.String = "{{{basePath}}}") : ApiClient(basePath) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,8 @@
package {{packageName}}.infrastructure

import com.squareup.moshi.FromJson
import com.squareup.moshi.KotlinJsonAdapterFactory
import com.squareup.moshi.Moshi
import com.squareup.moshi.ToJson
import com.squareup.moshi.Rfc3339DateJsonAdapter
import okhttp3.OkHttpClient
import okhttp3.RequestBody
import okhttp3.MediaType
Expand All @@ -12,7 +11,7 @@ import okhttp3.HttpUrl
import okhttp3.ResponseBody
import okhttp3.Request
import java.io.File
import java.util.UUID
import java.util.Date

open class ApiClient(val baseUrl: String) {
companion object {
Expand Down Expand Up @@ -63,12 +62,11 @@ open class ApiClient(val baseUrl: String) {
return null
}
return when(mediaType) {
JsonMediaType -> Moshi.Builder().add(object {
@ToJson
fun toJson(uuid: UUID) = uuid.toString()
@FromJson
fun fromJson(s: String) = UUID.fromString(s)
})
JsonMediaType -> Moshi.Builder()
.add(Date::class.java, Rfc3339DateJsonAdapter().nullSafe())
.add(LocalDateTimeAdapter())
.add(LocalDateAdapter())
.add(UUIDAdapter())
.add(ByteArrayAdapter())
.add(KotlinJsonAdapterFactory())
.build().adapter(T::class.java).fromJson(bodyContent)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package {{packageName}}.infrastructure

import com.squareup.moshi.FromJson
import com.squareup.moshi.ToJson
{{^threetenbp}}
import java.time.LocalDate
import java.time.format.DateTimeFormatter
{{/threetenbp}}
{{#threetenbp}}
import org.threeten.bp.LocalDate
import org.threeten.bp.format.DateTimeFormatter
{{/threetenbp}}

class LocalDateAdapter {
@ToJson
fun toJson(value: LocalDate): String {
return DateTimeFormatter.ISO_LOCAL_DATE.format(value)
}

@FromJson
fun fromJson(value: String): LocalDate {
return LocalDate.parse(value, DateTimeFormatter.ISO_LOCAL_DATE)
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package {{packageName}}.infrastructure

import com.squareup.moshi.FromJson
import com.squareup.moshi.ToJson
{{^threetenbp}}
import java.time.LocalDateTime
import java.time.format.DateTimeFormatter
{{/threetenbp}}
{{#threetenbp}}
import org.threeten.bp.LocalDateTime
import org.threeten.bp.format.DateTimeFormatter
{{/threetenbp}}

class LocalDateTimeAdapter {
@ToJson
fun toJson(value: LocalDateTime): String {
return DateTimeFormatter.ISO_LOCAL_DATE_TIME.format(value)
}

@FromJson
fun fromJson(value: String): LocalDateTime {
return LocalDateTime.parse(value, DateTimeFormatter.ISO_LOCAL_DATE_TIME)
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,16 @@ package {{packageName}}.infrastructure
import com.squareup.moshi.KotlinJsonAdapterFactory
import com.squareup.moshi.Moshi
import com.squareup.moshi.Rfc3339DateJsonAdapter
import java.util.*
import java.util.Date

object Serializer {
@JvmStatic
val moshi: Moshi = Moshi.Builder()
.add(KotlinJsonAdapterFactory())
.add(Date::class.java, Rfc3339DateJsonAdapter().nullSafe())
.add(LocalDateTimeAdapter())
.add(LocalDateAdapter())
.add(UUIDAdapter())
.add(ByteArrayAdapter())
.add(KotlinJsonAdapterFactory())
.build()
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package {{packageName}}.infrastructure

import com.squareup.moshi.FromJson
import com.squareup.moshi.ToJson
import java.util.UUID

class UUIDAdapter {
@ToJson
fun toJson(uuid: UUID) = uuid.toString()

@FromJson
fun fromJson(s: String) = UUID.fromString(s)
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,6 @@ package {{modelPackage}}

{{#imports}}import {{import}}
{{/imports}}
{{#threetenbp}}
import org.threeten.bp.LocalDateTime
{{/threetenbp}}

{{#models}}
{{#model}}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,8 @@
package org.openapitools.client.infrastructure

import com.squareup.moshi.FromJson
import com.squareup.moshi.KotlinJsonAdapterFactory
import com.squareup.moshi.Moshi
import com.squareup.moshi.ToJson
import com.squareup.moshi.Rfc3339DateJsonAdapter
import okhttp3.OkHttpClient
import okhttp3.RequestBody
import okhttp3.MediaType
Expand All @@ -12,7 +11,7 @@ import okhttp3.HttpUrl
import okhttp3.ResponseBody
import okhttp3.Request
import java.io.File
import java.util.UUID
import java.util.Date

open class ApiClient(val baseUrl: String) {
companion object {
Expand Down Expand Up @@ -63,12 +62,11 @@ open class ApiClient(val baseUrl: String) {
return null
}
return when(mediaType) {
JsonMediaType -> Moshi.Builder().add(object {
@ToJson
fun toJson(uuid: UUID) = uuid.toString()
@FromJson
fun fromJson(s: String) = UUID.fromString(s)
})
JsonMediaType -> Moshi.Builder()
.add(Date::class.java, Rfc3339DateJsonAdapter().nullSafe())
.add(LocalDateTimeAdapter())
.add(LocalDateAdapter())
.add(UUIDAdapter())
.add(ByteArrayAdapter())
.add(KotlinJsonAdapterFactory())
.build().adapter(T::class.java).fromJson(bodyContent)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package org.openapitools.client.infrastructure

import com.squareup.moshi.FromJson
import com.squareup.moshi.ToJson
import java.time.LocalDate
import java.time.format.DateTimeFormatter

class LocalDateAdapter {
@ToJson
fun toJson(value: LocalDate): String {
return DateTimeFormatter.ISO_LOCAL_DATE.format(value)
}

@FromJson
fun fromJson(value: String): LocalDate {
return LocalDate.parse(value, DateTimeFormatter.ISO_LOCAL_DATE)
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package org.openapitools.client.infrastructure

import com.squareup.moshi.FromJson
import com.squareup.moshi.ToJson
import java.time.LocalDateTime
import java.time.format.DateTimeFormatter

class LocalDateTimeAdapter {
@ToJson
fun toJson(value: LocalDateTime): String {
return DateTimeFormatter.ISO_LOCAL_DATE_TIME.format(value)
}

@FromJson
fun fromJson(value: String): LocalDateTime {
return LocalDateTime.parse(value, DateTimeFormatter.ISO_LOCAL_DATE_TIME)
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,16 @@ package org.openapitools.client.infrastructure
import com.squareup.moshi.KotlinJsonAdapterFactory
import com.squareup.moshi.Moshi
import com.squareup.moshi.Rfc3339DateJsonAdapter
import java.util.*
import java.util.Date

object Serializer {
@JvmStatic
val moshi: Moshi = Moshi.Builder()
.add(KotlinJsonAdapterFactory())
.add(Date::class.java, Rfc3339DateJsonAdapter().nullSafe())
.add(LocalDateTimeAdapter())
.add(LocalDateAdapter())
.add(UUIDAdapter())
.add(ByteArrayAdapter())
.add(KotlinJsonAdapterFactory())
.build()
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package org.openapitools.client.infrastructure

import com.squareup.moshi.FromJson
import com.squareup.moshi.ToJson
import java.util.UUID

class UUIDAdapter {
@ToJson
fun toJson(uuid: UUID) = uuid.toString()

@FromJson
fun fromJson(s: String) = UUID.fromString(s)
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,33 +2,35 @@ package org.openapitools.client

import io.kotlintest.shouldBe
import io.kotlintest.matchers.numerics.shouldBeGreaterThan
import io.kotlintest.matchers.string.shouldContain
import io.kotlintest.shouldThrow
import io.kotlintest.specs.ShouldSpec
import org.openapitools.client.apis.PetApi
import org.openapitools.client.infrastructure.ClientException
import org.openapitools.client.models.Category
import org.openapitools.client.models.Pet
import org.openapitools.client.models.Tag

class PetApiTest : ShouldSpec() {
init {

val petId:Long = 10006
val api = PetApi()

should("add a pet") {
val petId:Long = 10006

val pet = Pet(
id = petId,
name = "kotlin client test",
photoUrls = arrayOf("http://test_kotlin_unit_test.com"),
category = Category(petId, "test kotlin category"),
tags = arrayOf(Tag(petId, "test kotlin tag"))
)

val api = PetApi()
api.addPet(pet)

}

should("get pet by id") {
val petId: Long = 10006
val api = PetApi()
val result = api.getPetById(petId)

result.id shouldBe (petId)
Expand All @@ -42,7 +44,6 @@ class PetApiTest : ShouldSpec() {
}

should("find pet by status") {
val api = PetApi()
val result = api.findPetsByStatus(arrayOf("available"))

result.size.shouldBeGreaterThan(0)
Expand All @@ -58,15 +59,12 @@ class PetApiTest : ShouldSpec() {
}

should("update a pet") {
val petId:Long = 10007
val pet = Pet(
id = petId,
name = "kotlin client updatePet",
status = Pet.Status.pending,
photoUrls = arrayOf("http://test_kotlin_unit_test.com")
)

val api = PetApi()
api.updatePet(pet)

// verify updated Pet
Expand All @@ -77,14 +75,10 @@ class PetApiTest : ShouldSpec() {

}

//TODO the test fail cause client doesn't support other JSON contentType/Accept
/*
should("update a pet with form") {
val petId:Long = 10007
val name = "kotlin client updatePet with Form"
val status = "pending"

val api = PetApi()
api.updatePetWithForm(petId, name, status)

// verify updated Pet
Expand All @@ -94,7 +88,16 @@ class PetApiTest : ShouldSpec() {
result.status shouldBe (Pet.Status.pending)

}
*/

should("delete a pet") {
api.deletePet(petId, "apiKey")

// verify updated Pet
val exception = shouldThrow<ClientException> {
api.getPetById(petId)
}
exception.message?.shouldContain("Pet not found")
}

}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,6 @@ import org.openapitools.client.infrastructure.RequestMethod
import org.openapitools.client.infrastructure.ResponseType
import org.openapitools.client.infrastructure.Success
import org.openapitools.client.infrastructure.toMultiValue
import org.threeten.bp.LocalDateTime

class PetApi(basePath: kotlin.String = "http://petstore.swagger.io/v2") : ApiClient(basePath) {

Expand Down
Loading