From 44f59b7bfd397a9fc2647b446cdcce98479298ae Mon Sep 17 00:00:00 2001 From: dkarwacki Date: Mon, 8 Feb 2021 10:39:30 +0100 Subject: [PATCH] use SString schema for LocalDateTime codec --- core/src/main/scala/sttp/tapir/Schema.scala | 23 ++++++++----------- .../test/resources/expected_localDateTime.yml | 17 ++++++++++++++ .../tapir/docs/openapi/VerifyYamlTest.scala | 14 ++++++++++- 3 files changed, 40 insertions(+), 14 deletions(-) create mode 100644 docs/openapi-docs/src/test/resources/expected_localDateTime.yml diff --git a/core/src/main/scala/sttp/tapir/Schema.scala b/core/src/main/scala/sttp/tapir/Schema.scala index e82f6e6bef..32721ec713 100644 --- a/core/src/main/scala/sttp/tapir/Schema.scala +++ b/core/src/main/scala/sttp/tapir/Schema.scala @@ -1,22 +1,19 @@ package sttp.tapir -import java.io.InputStream -import java.math.{BigDecimal => JBigDecimal} -import java.nio.ByteBuffer -import java.time._ -import java.util.{Date, UUID} - +import magnolia.Magnolia import sttp.model.Part import sttp.tapir.SchemaType._ +import sttp.tapir.generic.Derived import sttp.tapir.generic.internal.OneOfMacro.oneOfMacro -import sttp.tapir.generic.internal.SchemaMapMacro +import sttp.tapir.generic.internal.{SchemaMagnoliaDerivation, SchemaMapMacro} import sttp.tapir.internal.ModifySchemaMacro -import scala.annotation.StaticAnnotation -import scala.annotation.implicitNotFound -import sttp.tapir.generic.Derived -import sttp.tapir.generic.internal.SchemaMagnoliaDerivation -import magnolia.Magnolia +import java.io.InputStream +import java.math.{BigDecimal => JBigDecimal} +import java.nio.ByteBuffer +import java.time._ +import java.util.{Date, UUID} +import scala.annotation.{StaticAnnotation, implicitNotFound} /** Describes the type `T`: its low-level representation, meta-data and validation rules. * @param format The name of the format of the low-level representation of `T`. @@ -142,7 +139,7 @@ object Schema extends SchemaExtensions with SchemaMagnoliaDerivation with LowPri implicit val schemaForZonedDateTime: Schema[ZonedDateTime] = Schema(SDateTime) implicit val schemaForOffsetDateTime: Schema[OffsetDateTime] = Schema(SDateTime) implicit val schemaForDate: Schema[Date] = Schema(SDateTime) - implicit val schemaForLocalDateTime: Schema[LocalDateTime] = Schema(SDateTime) + implicit val schemaForLocalDateTime: Schema[LocalDateTime] = Schema(SString) implicit val schemaForLocalDate: Schema[LocalDate] = Schema(SDate) implicit val schemaForZoneOffset: Schema[ZoneOffset] = Schema(SString) implicit val schemaForJavaDuration: Schema[Duration] = Schema(SString) diff --git a/docs/openapi-docs/src/test/resources/expected_localDateTime.yml b/docs/openapi-docs/src/test/resources/expected_localDateTime.yml new file mode 100644 index 0000000000..8231dfd27a --- /dev/null +++ b/docs/openapi-docs/src/test/resources/expected_localDateTime.yml @@ -0,0 +1,17 @@ +openapi: 3.0.3 +info: + title: Examples + version: '1.0' +paths: + /: + get: + operationId: getRoot + parameters: + - name: localDateTime + in: query + required: true + schema: + type: string + responses: + '200': + description: '' diff --git a/docs/openapi-docs/src/test/scala/sttp/tapir/docs/openapi/VerifyYamlTest.scala b/docs/openapi-docs/src/test/scala/sttp/tapir/docs/openapi/VerifyYamlTest.scala index bc4a12fb2b..33f628a968 100644 --- a/docs/openapi-docs/src/test/scala/sttp/tapir/docs/openapi/VerifyYamlTest.scala +++ b/docs/openapi-docs/src/test/scala/sttp/tapir/docs/openapi/VerifyYamlTest.scala @@ -1,6 +1,6 @@ package sttp.tapir.docs.openapi -import java.time.Instant +import java.time.{Instant, LocalDateTime} import io.circe.Json import io.circe.generic.auto._ import sttp.model.{Method, StatusCode} @@ -896,6 +896,18 @@ class VerifyYamlTest extends AnyFunSuite with Matchers { actualYamlNoIndent shouldBe expectedYaml } + test("should use string format for LocalDateTime fields") { + + val expectedYaml = loadYaml("expected_localDateTime.yml") + + val e = endpoint.in(query[LocalDateTime]("localDateTime")) + + val actualYaml = OpenAPIDocsInterpreter.toOpenAPI(e, Info("Examples", "1.0")).toYaml + val actualYamlNoIndent = noIndentation(actualYaml) + + actualYamlNoIndent shouldBe expectedYaml + } + test("exclusive bounds") { val expectedYaml = loadYaml("expected_exclusive_bounds.yml")