Skip to content

Commit

Permalink
Add support for the UUID format of strings (#57)
Browse files Browse the repository at this point in the history
* Add support for the UUID format of strings

* Add parameter name for readability
  • Loading branch information
cjbooms authored Jun 23, 2021
1 parent a101db4 commit fb17736
Show file tree
Hide file tree
Showing 7 changed files with 25 additions and 11 deletions.
3 changes: 3 additions & 0 deletions src/main/kotlin/com/cjbooms/fabrikt/model/KotlinTypeInfo.kt
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import com.reprezen.kaizen.oasparser.model3.Schema
import java.math.BigDecimal
import java.time.LocalDate
import java.time.OffsetDateTime
import java.util.UUID
import kotlin.reflect.KClass

sealed class KotlinTypeInfo(val modelKClass: KClass<*>, val generatedModelClassName: String? = null) {
Expand All @@ -22,6 +23,7 @@ sealed class KotlinTypeInfo(val modelKClass: KClass<*>, val generatedModelClassN
object Numeric : KotlinTypeInfo(BigDecimal::class)
object Integer : KotlinTypeInfo(Int::class)
object BigInt : KotlinTypeInfo(Long::class)
object Uuid : KotlinTypeInfo(UUID::class)
object Boolean : KotlinTypeInfo(kotlin.Boolean::class)
object UntypedObject : KotlinTypeInfo(Any::class)
data class Object(val simpleClassName: String) : KotlinTypeInfo(GeneratedType::class, simpleClassName)
Expand All @@ -47,6 +49,7 @@ sealed class KotlinTypeInfo(val modelKClass: KClass<*>, val generatedModelClassN
OasType.Text -> Text
OasType.Enum ->
Enum(schema.getEnumValues(), schema.toModelClassName(enclosingName.toModelClassName()))
OasType.Uuid -> Uuid
OasType.Double -> Double
OasType.Float -> Float
OasType.Number -> Numeric
Expand Down
4 changes: 4 additions & 0 deletions src/main/kotlin/com/cjbooms/fabrikt/model/OasType.kt
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import com.cjbooms.fabrikt.util.KaizenParserExtensions.isSchemaLess
import com.cjbooms.fabrikt.util.KaizenParserExtensions.isTypedAdditionalProperties
import com.cjbooms.fabrikt.util.KaizenParserExtensions.isUnknownAdditionalProperties
import com.cjbooms.fabrikt.util.KaizenParserExtensions.isUntypedAdditionalProperties
import com.cjbooms.fabrikt.util.KaizenParserExtensions.isUuidDefinition
import com.cjbooms.fabrikt.util.KaizenParserExtensions.safeType
import com.reprezen.kaizen.oasparser.model3.Schema
import kotlin.reflect.KClass
Expand All @@ -30,6 +31,7 @@ sealed class OasType(
object Array : OasType("array")
object UntypedObject : OasType("object", specialization = Specialization.UNTYPED_OBJECT)
object Enum : OasType("string", specialization = Specialization.ENUM)
object Uuid : OasType("string", specialization = Specialization.UUID)
object Map : OasType("object", specialization = Specialization.MAP)
object UnknownProperties : OasType("object", specialization = Specialization.UNKNOWN_ADDITIONAL_PROPERTIES)
object UntypedProperties : OasType("object", specialization = Specialization.UNTYPED_OBJECT_ADDITIONAL_PROPERTIES)
Expand All @@ -51,6 +53,7 @@ sealed class OasType(

private fun Schema.getSpecialization(oasKey: String): Specialization =
when {
isUuidDefinition() -> Specialization.UUID
isEnumDefinition() -> Specialization.ENUM
isInlineableMapDefinition() -> Specialization.MAP
isTypedAdditionalProperties(oasKey) -> Specialization.TYPED_OBJECT_ADDITIONAL_PROPERTIES
Expand All @@ -68,6 +71,7 @@ sealed class OasType(
TYPED_OBJECT_ADDITIONAL_PROPERTIES,
UNTYPED_OBJECT_ADDITIONAL_PROPERTIES,
UNTYPED_OBJECT,
UUID,
NONE
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,9 @@ object KaizenParserExtensions {
)
)

fun Schema.isUuidDefinition(): Boolean =
this.type == OasType.Text.type && (this.format?.equals("uuid", ignoreCase = true) == true)

@Suppress("UNCHECKED_CAST")
fun Schema.getEnumValues(): List<String> = when {
this.hasEnums() -> this.enums.map { it.toString() }
Expand Down
1 change: 1 addition & 0 deletions src/test/resources/examples/githubApi/api.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -716,6 +716,7 @@ components:
required: false
schema:
type: string
format: uuid
example: 84035561-4e44-4a06-98d2-1744eeefca6d
FlowId:
name: X-Flow-Id
Expand Down
19 changes: 10 additions & 9 deletions src/test/resources/examples/githubApi/controllers/Controllers.kt
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ import org.springframework.web.bind.annotation.RequestHeader
import org.springframework.web.bind.annotation.RequestMapping
import org.springframework.web.bind.annotation.RequestMethod
import org.springframework.web.bind.annotation.RequestParam
import java.util.UUID
import javax.validation.Valid
import javax.validation.constraints.Max
import javax.validation.constraints.Min
Expand Down Expand Up @@ -105,7 +106,7 @@ interface ContributorsController {
@RequestBody @Valid
contributor: Contributor,
@RequestHeader(value = "X-Flow-Id", required = false) xFlowId: String?,
@RequestHeader(value = "Idempotency-Key", required = false) idempotencyKey: String?
@RequestHeader(value = "Idempotency-Key", required = false) idempotencyKey: UUID?
): ResponseEntity<Unit>

/**
Expand Down Expand Up @@ -169,7 +170,7 @@ interface ContributorsController {
@PathVariable(value = "id", required = true) id: String,
@RequestHeader(value = "If-Match", required = true) ifMatch: String,
@RequestHeader(value = "X-Flow-Id", required = false) xFlowId: String?,
@RequestHeader(value = "Idempotency-Key", required = false) idempotencyKey: String?
@RequestHeader(value = "Idempotency-Key", required = false) idempotencyKey: UUID?
): ResponseEntity<Unit>
}

Expand Down Expand Up @@ -230,7 +231,7 @@ interface OrganisationsController {
@RequestBody @Valid
organisation: Organisation,
@RequestHeader(value = "X-Flow-Id", required = false) xFlowId: String?,
@RequestHeader(value = "Idempotency-Key", required = false) idempotencyKey: String?
@RequestHeader(value = "Idempotency-Key", required = false) idempotencyKey: UUID?
): ResponseEntity<Unit>

/**
Expand Down Expand Up @@ -294,7 +295,7 @@ interface OrganisationsController {
@PathVariable(value = "id", required = true) id: String,
@RequestHeader(value = "If-Match", required = true) ifMatch: String,
@RequestHeader(value = "X-Flow-Id", required = false) xFlowId: String?,
@RequestHeader(value = "Idempotency-Key", required = false) idempotencyKey: String?
@RequestHeader(value = "Idempotency-Key", required = false) idempotencyKey: UUID?
): ResponseEntity<Unit>
}

Expand Down Expand Up @@ -390,7 +391,7 @@ interface OrganisationsContributorsController {
@PathVariable(value = "id", required = true) id: String,
@RequestHeader(value = "If-Match", required = true) ifMatch: String,
@RequestHeader(value = "X-Flow-Id", required = false) xFlowId: String?,
@RequestHeader(value = "Idempotency-Key", required = false) idempotencyKey: String?
@RequestHeader(value = "Idempotency-Key", required = false) idempotencyKey: UUID?
): ResponseEntity<Unit>

/**
Expand Down Expand Up @@ -479,7 +480,7 @@ interface RepositoriesController {
@RequestBody @Valid
repository: Repository,
@RequestHeader(value = "X-Flow-Id", required = false) xFlowId: String?,
@RequestHeader(value = "Idempotency-Key", required = false) idempotencyKey: String?
@RequestHeader(value = "Idempotency-Key", required = false) idempotencyKey: UUID?
): ResponseEntity<Unit>

/**
Expand Down Expand Up @@ -543,7 +544,7 @@ interface RepositoriesController {
@PathVariable(value = "id", required = true) id: String,
@RequestHeader(value = "If-Match", required = true) ifMatch: String,
@RequestHeader(value = "X-Flow-Id", required = false) xFlowId: String?,
@RequestHeader(value = "Idempotency-Key", required = false) idempotencyKey: String?
@RequestHeader(value = "Idempotency-Key", required = false) idempotencyKey: UUID?
): ResponseEntity<Unit>
}

Expand Down Expand Up @@ -609,7 +610,7 @@ interface RepositoriesPullRequestsController {
pullRequest: PullRequest,
@PathVariable(value = "parent-id", required = true) parentId: String,
@RequestHeader(value = "X-Flow-Id", required = false) xFlowId: String?,
@RequestHeader(value = "Idempotency-Key", required = false) idempotencyKey: String?
@RequestHeader(value = "Idempotency-Key", required = false) idempotencyKey: UUID?
): ResponseEntity<Unit>

/**
Expand Down Expand Up @@ -672,6 +673,6 @@ interface RepositoriesPullRequestsController {
@PathVariable(value = "id", required = true) id: String,
@RequestHeader(value = "If-Match", required = true) ifMatch: String,
@RequestHeader(value = "X-Flow-Id", required = false) xFlowId: String?,
@RequestHeader(value = "Idempotency-Key", required = false) idempotencyKey: String?
@RequestHeader(value = "Idempotency-Key", required = false) idempotencyKey: UUID?
): ResponseEntity<Unit>
}
3 changes: 2 additions & 1 deletion src/test/resources/examples/optionalVsRequired/api.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -9,4 +9,5 @@ components:
name:
type: string
gender:
type: string
type: string
format: uuid
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package examples.optionalVsRequired.models

import com.fasterxml.jackson.annotation.JsonProperty
import java.util.UUID
import javax.validation.constraints.NotNull
import kotlin.String

Expand All @@ -11,5 +12,5 @@ data class OptionalVsRequired(
val name: String,
@param:JsonProperty("gender")
@get:JsonProperty("gender")
val gender: String? = null
val gender: UUID? = null
)

0 comments on commit fb17736

Please sign in to comment.