Skip to content
Open
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 @@ -51,7 +51,7 @@ object {{classname}} {
import io.circe.syntax._
import io.circe.generic.semiauto._

implicit val encoder: Encoder[{{classname}}] = deriveEncoder
implicit val encoder: Encoder[{{classname}}] = deriveEncoder[{{classname}}].mapJson(_.dropNullValues)
implicit val decoder: Decoder[{{classname}}] = deriveDecoder
}
{{/circe}}
Expand Down Expand Up @@ -180,7 +180,7 @@ object {{classname}} {
import io.circe.{Encoder, Decoder}
import io.circe.generic.semiauto._

implicit val encoder: Encoder[{{classname}}] = deriveEncoder
implicit val encoder: Encoder[{{classname}}] = deriveEncoder[{{classname}}].mapJson(_.dropNullValues)
implicit val decoder: Decoder[{{classname}}] = deriveDecoder
{{/vendorExtensions.x-use-discr}}
{{#vendorExtensions.x-use-discr}}
Expand All @@ -198,7 +198,7 @@ object {{classname}} {
case other => sys.error(s"Invalid {{classname}} discriminant: ${other}")
}
)
implicit val encoder: Encoder[{{classname}}] = deriveConfiguredEncoder
implicit val encoder: Encoder[{{classname}}] = deriveConfiguredEncoder[{{classname}}].mapJson(_.dropNullValues)
implicit val decoder: Decoder[{{classname}}] = deriveConfiguredDecoder
{{/vendorExtensions.x-use-discr}}
{{/vendorExtensions.x-hasWrappedOneOfMembers}}
Expand Down Expand Up @@ -326,7 +326,7 @@ object {{classname}} {
import io.circe.syntax._
import io.circe.generic.semiauto._

implicit val encoder: Encoder[{{classname}}] = deriveEncoder
implicit val encoder: Encoder[{{classname}}] = deriveEncoder[{{classname}}].mapJson(_.dropNullValues)
implicit val decoder: Decoder[{{classname}}] = deriveDecoder
}
{{/circe}}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -333,4 +333,37 @@ public void verifyDateTimeLocalGeneratesLocalDateTime() throws IOException {
assertFileContains(modelPath, "createdAt: OffsetDateTime");
assertFileContains(modelPath, "updatedAt: Option[OffsetDateTime]");
}

@Test
public void verifyOptionalFieldsOmittedWhenNone() throws IOException {
File output = Files.createTempDirectory("test").toFile().getCanonicalFile();
output.deleteOnExit();
String outputPath = output.getAbsolutePath().replace('\\', '/');

OpenAPI openAPI = new OpenAPIParser()
.readLocation("src/test/resources/3_0/scala/sttp4-optional-fields.yaml", null, new ParseOptions()).getOpenAPI();

ScalaSttp4ClientCodegen codegen = new ScalaSttp4ClientCodegen();
codegen.setOutputDir(output.getAbsolutePath());
codegen.additionalProperties().put("jsonLibrary", "circe");

ClientOptInput input = new ClientOptInput();
input.openAPI(openAPI);
input.config(codegen);

DefaultGenerator generator = new DefaultGenerator();

generator.setGeneratorPropertyDefault(CodegenConstants.MODELS, "true");
generator.setGeneratorPropertyDefault(CodegenConstants.MODEL_TESTS, "false");
generator.setGeneratorPropertyDefault(CodegenConstants.MODEL_DOCS, "false");
generator.setGeneratorPropertyDefault(CodegenConstants.APIS, "false");
generator.setGeneratorPropertyDefault(CodegenConstants.SUPPORTING_FILES, "false");
generator.opts(input).generate();

// Optional fields set to None must be omitted from the JSON (sttp3 parity),
// not serialized as null: strict servers reject explicit null for
// non-nullable optional properties.
Path petPath = Paths.get(outputPath + "/src/main/scala/org/openapitools/client/model/Pet.scala");
assertFileContains(petPath, "implicit val encoder: Encoder[Pet] = deriveEncoder[Pet].mapJson(_.dropNullValues)");
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
openapi: 3.0.3
info:
title: Optional field test
version: 1.0.0
paths:
/pets:
post:
operationId: createPet
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/Pet'
responses:
'200':
description: OK
content:
application/json:
schema:
$ref: '#/components/schemas/Pet'
components:
schemas:
Pet:
type: object
required:
- name
properties:
name:
type: string
tag:
type: string
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,6 @@ object ApiResponse {
import io.circe.syntax._
import io.circe.generic.semiauto._

implicit val encoder: Encoder[ApiResponse] = deriveEncoder
implicit val encoder: Encoder[ApiResponse] = deriveEncoder[ApiResponse].mapJson(_.dropNullValues)
implicit val decoder: Decoder[ApiResponse] = deriveDecoder
}
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,6 @@ object Category {
import io.circe.syntax._
import io.circe.generic.semiauto._

implicit val encoder: Encoder[Category] = deriveEncoder
implicit val encoder: Encoder[Category] = deriveEncoder[Category].mapJson(_.dropNullValues)
implicit val decoder: Decoder[Category] = deriveDecoder
}
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ object Order {
import io.circe.syntax._
import io.circe.generic.semiauto._

implicit val encoder: Encoder[Order] = deriveEncoder
implicit val encoder: Encoder[Order] = deriveEncoder[Order].mapJson(_.dropNullValues)
implicit val decoder: Decoder[Order] = deriveDecoder
}
object OrderEnums {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ object Pet {
import io.circe.syntax._
import io.circe.generic.semiauto._

implicit val encoder: Encoder[Pet] = deriveEncoder
implicit val encoder: Encoder[Pet] = deriveEncoder[Pet].mapJson(_.dropNullValues)
implicit val decoder: Decoder[Pet] = deriveDecoder
}
object PetEnums {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,6 @@ object Tag {
import io.circe.syntax._
import io.circe.generic.semiauto._

implicit val encoder: Encoder[Tag] = deriveEncoder
implicit val encoder: Encoder[Tag] = deriveEncoder[Tag].mapJson(_.dropNullValues)
implicit val decoder: Decoder[Tag] = deriveDecoder
}
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,6 @@ object User {
import io.circe.syntax._
import io.circe.generic.semiauto._

implicit val encoder: Encoder[User] = deriveEncoder
implicit val encoder: Encoder[User] = deriveEncoder[User].mapJson(_.dropNullValues)
implicit val decoder: Decoder[User] = deriveDecoder
}
Loading