Skip to content

Commit d5a4516

Browse files
authored
Merge pull request #4 from SamTheisens/fix/duplicate-entry-for-annotated-enums
Fix: duplicate entry for annotated enums
2 parents 0b3c363 + 78d30c0 commit d5a4516

File tree

4 files changed

+40
-16
lines changed

4 files changed

+40
-16
lines changed

.gitignore

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
1-
1+
target/
22
.bsp/sbt.json
3+
.idea/

src/main/scala/com/github/swagger/enumeratum/converter/SwaggerEnumeratumModelConverter.scala

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -14,34 +14,34 @@ import io.swagger.v3.oas.models.media.Schema
1414
class SwaggerEnumeratumModelConverter extends ModelResolver(Json.mapper()) {
1515
private val enumEntryClass = classOf[EnumEntry]
1616

17+
def noneIfEmpty(s: String): Option[String] = Option(s).filter(_.trim.nonEmpty)
18+
1719
override def resolve(annotatedType: AnnotatedType, context: ModelConverterContext, chain: Iterator[ModelConverter]): Schema[_] = {
1820
val javaType = _mapper.constructType(annotatedType.getType)
1921
val cls = javaType.getRawClass
2022
if (isEnum(cls)) {
2123
val sp: Schema[String] = PrimitiveType.STRING.createProperty().asInstanceOf[Schema[String]]
2224
setRequired(annotatedType)
23-
getValues(cls).foreach { v =>
25+
getValues(cls).foreach { v: String =>
2426
sp.addEnumItemObject(v)
2527
}
2628
nullSafeList(annotatedType.getCtxAnnotations).foreach {
2729
case p: Parameter => {
28-
Option(p.description).foreach(desc => sp.setDescription(desc))
30+
noneIfEmpty(p.description).foreach(desc => sp.setDescription(desc))
2931
sp.setDeprecated(p.deprecated)
30-
Option(p.example).foreach(ex => sp.setExample(ex))
31-
Option(p.name).foreach(name => sp.setName(name))
32+
noneIfEmpty(p.example).foreach(ex => sp.setExample(ex))
33+
noneIfEmpty(p.name).foreach(name => sp.setName(name))
3234
}
3335
case s: SchemaAnnotation => {
34-
Option(s.description).foreach(desc => sp.setDescription(desc))
35-
Option(s.defaultValue).foreach(df => sp.setDefault(df))
36+
noneIfEmpty(s.description).foreach(desc => sp.setDescription(desc))
37+
noneIfEmpty(s.defaultValue).foreach(df => sp.setDefault(df))
3638
sp.setDeprecated(s.deprecated)
37-
Option(s.example).foreach(ex => sp.setExample(ex))
38-
Option(s.name).foreach(name => sp.setName(name))
39-
Option(s.accessMode).foreach { accessMode =>
40-
accessMode match {
41-
case AccessMode.READ_ONLY => sp.setReadOnly(true)
42-
case AccessMode.WRITE_ONLY => sp.setWriteOnly(true)
43-
case _ =>
44-
}
39+
noneIfEmpty(s.example).foreach(ex => sp.setExample(ex))
40+
noneIfEmpty(s.name).foreach(name => sp.setName(name))
41+
Option(s.accessMode).foreach {
42+
case AccessMode.READ_ONLY => sp.setReadOnly(true)
43+
case AccessMode.WRITE_ONLY => sp.setWriteOnly(true)
44+
case _ =>
4545
}
4646
}
4747
case _ =>

src/test/scala/com/github/swagger/enumeratum/converter/ModelPropertyParserTest.scala

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ package com.github.swagger.enumeratum.converter
22

33
import io.swagger.v3.core.converter._
44
import io.swagger.v3.oas.models.media._
5-
import models.{Ctx, ModelWCtxEnum, ModelWEnum, ModelWEnumAnnotated, ModelWEnumSet, ModelWOptionalEnum, OrderSize}
5+
import models.{Ctx, ModelWCtxEnum, ModelWCtxEnumAndAnnotation, ModelWEnum, ModelWEnumAnnotated, ModelWEnumSet, ModelWOptionalEnum, OrderSize}
66
import org.scalatest.OptionValues
77
import org.scalatest.flatspec.AnyFlatSpec
88
import org.scalatest.matchers.should.Matchers
@@ -60,13 +60,33 @@ class ModelPropertyParserTest extends AnyFlatSpec with Matchers with OptionValue
6060
it should "process Model for Enumeratum Enum defined in scope of another object" in {
6161
val converter = ModelConverters.getInstance()
6262
val schemas = converter.readAll(classOf[ModelWCtxEnum]).asScala.toMap
63+
schemas.keys should have size 1
6364
val model = findModel(schemas, "ModelWCtxEnum")
6465
model should be (defined)
6566
model.get.getProperties should not be (null)
6667
val field = model.value.getProperties.get("field")
6768
field shouldBe a [StringSchema]
6869
val schema = field.asInstanceOf[StringSchema]
6970
schema.getDescription shouldEqual (null)
71+
schema.getDefault should be (null)
72+
schema.getEnum.asScala shouldEqual Ctx.Color.values.map(_.entryName)
73+
nullSafeList(model.value.getRequired) shouldBe Seq("field")
74+
}
75+
76+
it should "not add additional model when enum field is annotated" in {
77+
val converter = ModelConverters.getInstance()
78+
val schemas = converter.readAll(classOf[ModelWCtxEnumAndAnnotation]).asScala.toMap
79+
schemas.keys should have size 1
80+
81+
val model = findModel(schemas, "ModelWCtxEnum")
82+
model should be(defined)
83+
model.get.getProperties should not be (null)
84+
val field = model.value.getProperties.get("field")
85+
field shouldBe a[StringSchema]
86+
val schema = field.asInstanceOf[StringSchema]
87+
schema.getDescription shouldEqual "An annotated field"
88+
schema.getName shouldEqual "field"
89+
schema.getDefault should be (null)
7090
schema.getEnum.asScala shouldEqual Ctx.Color.values.map(_.entryName)
7191
nullSafeList(model.value.getRequired) shouldBe Seq("field")
7292
}

src/test/scala/models/Ctx.scala

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package models
22

33
import enumeratum.{Enum, EnumEntry}
4+
import io.swagger.v3.oas.annotations.media.Schema
45

56
object Ctx {
67
sealed abstract class Color(override val entryName: String) extends EnumEntry
@@ -16,3 +17,5 @@ object Ctx {
1617
}
1718

1819
case class ModelWCtxEnum(field: Ctx.Color)
20+
21+
case class ModelWCtxEnumAndAnnotation(@Schema(description = "An annotated field", required = true) field: Ctx.Color)

0 commit comments

Comments
 (0)