Skip to content
This repository was archived by the owner on Sep 14, 2022. It is now read-only.

Commit 22c03cb

Browse files
authored
Merge pull request #58 from swagger-api/develop
merge develop into master
2 parents 10d96f7 + 23eeaea commit 22c03cb

File tree

8 files changed

+84
-37
lines changed

8 files changed

+84
-37
lines changed

.travis.yml

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,7 @@
11
language: scala
22
jdk:
3-
- oraclejdk7
4-
- oraclejdk8
3+
- openjdk8
54
scala:
65
- 2.10.6
7-
- 2.11.8
8-
- 2.12.1
9-
matrix:
10-
exclude:
11-
- jdk: oraclejdk7
12-
scala: 2.12.1
6+
- 2.11.12
7+
- 2.12.6

build.sbt

Lines changed: 13 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,11 @@ import Defaults._
66

77
organization := "io.swagger"
88

9-
version := "1.0.4"
9+
version := "1.0.5-SNAPSHOT"
1010

11-
scalaVersion := "2.11.8"
11+
scalaVersion := "2.11.12"
1212

13-
crossScalaVersions := Seq("2.10.6", scalaVersion.value, "2.12.1")
13+
crossScalaVersions := Seq("2.10.6", scalaVersion.value, "2.12.6")
1414

1515
organizationHomepage in ThisBuild := Some(url("http://swagger.io"))
1616

@@ -23,9 +23,10 @@ publishArtifact in Test := false
2323
pomIncludeRepository := { x => false }
2424

2525
libraryDependencies ++= Seq(
26-
"io.swagger" % "swagger-core" % "1.5.12",
27-
"org.scalatest" %% "scalatest" % "3.0.1" % "test",
28-
"com.fasterxml.jackson.module" %% "jackson-module-scala" % "2.8.6",
26+
"org.scala-lang" % "scala-reflect" % scalaVersion.value,
27+
"io.swagger" % "swagger-core" % "1.5.22",
28+
"org.scalatest" %% "scalatest" % "3.0.5" % "test",
29+
"com.fasterxml.jackson.module" %% "jackson-module-scala" % "2.9.8",
2930
"junit" % "junit" % "4.12" % "test"
3031
)
3132

@@ -39,15 +40,12 @@ publishTo := {
3940
credentials in ThisBuild += Credentials (Path.userHome / ".ivy2" / ".credentials")
4041

4142
resolvers in ThisBuild ++= Seq(
42-
"Local Maven Repository" at "file://"+Path.userHome.absolutePath+"/.m2/repository",
43-
Resolver.url("Local Ivy Repository", url("file://"+Path.userHome.absolutePath+"/.ivy2/local"))(Resolver.ivyStylePatterns),
44-
"Typesafe Releases Repository" at "http://repo.typesafe.com/typesafe/releases/",
45-
"Typesafe Snapshots Repository" at "http://repo.typesafe.com/typesafe/snapshots/",
46-
"Maven Central" at "http://repo1.maven.org/maven2",
47-
"Typesafe Maven Releases Repository" at "https://typesafe.artifactoryonline.com/typesafe/maven-releases/",
48-
"Typesafe Maven Snapshots Repository" at "https://typesafe.artifactoryonline.com/typesafe/maven-snapshots/",
49-
"sonatype-snapshots" at "https://oss.sonatype.org/content/repositories/snapshots",
50-
"sonatype-releases" at "https://oss.sonatype.org/content/repositories/releases")
43+
Resolver.mavenLocal,
44+
Resolver.typesafeRepo("releases"),
45+
Resolver.typesafeRepo("snapshots"),
46+
Resolver.sonatypeRepo("releases"),
47+
Resolver.sonatypeRepo("snapshots")
48+
)
5149

5250
publishMavenStyle := true
5351

project/build.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
sbt.version=0.13.13
1+
sbt.version=1.1.2

project/plugins.sbt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
addSbtPlugin("com.typesafe.sbt" % "sbt-pgp" % "0.8.2")
1+
addSbtPlugin("com.jsuereth" % "sbt-pgp" % "1.1.1")

src/main/scala/io/swagger/scala/converter/SwaggerScalaModelConverter.scala

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -36,11 +36,11 @@ class SwaggerScalaModelConverter extends ModelConverter {
3636
return sp
3737
}
3838
case None =>
39-
if (cls.isAssignableFrom(classOf[BigDecimal])) {
39+
if (cls == classOf[BigDecimal]) {
4040
val dp = PrimitiveType.DECIMAL.createProperty()
4141
dp.setRequired(true)
4242
return dp
43-
} else if (cls.isAssignableFrom(classOf[BigInt])) {
43+
} else if (cls == classOf[BigInt]) {
4444
val dp = PrimitiveType.INT.createProperty()
4545
dp.setRequired(true)
4646
return dp
@@ -55,21 +55,25 @@ class SwaggerScalaModelConverter extends ModelConverter {
5555
val nextResolved = {
5656
Option(resolveProperty(nextType, context, annotations, chain)) match {
5757
case Some(p) => Some(p)
58-
case None if chain.hasNext() =>
58+
case None if chain.hasNext =>
5959
Option(chain.next().resolveProperty(nextType, context, annotations, chain))
6060
case _ => None
6161
}
6262
}
6363
nextResolved match {
64-
case Some(nextResolved) =>
65-
nextResolved.setRequired(false)
66-
nextResolved
64+
case Some(property) =>
65+
property.setRequired(false)
66+
property
6767
case None => null
6868
}
6969
case t if chain.hasNext =>
70-
val nextResolved = chain.next().resolveProperty(t, context, annotations, chain)
71-
nextResolved.setRequired(true)
72-
nextResolved
70+
val nextResolved = Option(chain.next().resolveProperty(t, context, annotations, chain))
71+
nextResolved match {
72+
case Some(property) =>
73+
property.setRequired(true)
74+
property
75+
case None => null
76+
}
7377
case _ =>
7478
null
7579
}

src/test/scala/ModelPropertyParserTest.scala

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,12 @@
1+
import java.lang.annotation.Annotation
2+
import java.lang.reflect.Type
3+
import java.util
4+
15
import io.swagger.converter._
26
import io.swagger.models.Model
37
import io.swagger.models.properties
48
import io.swagger.models.properties._
9+
import io.swagger.scala.converter.SwaggerScalaModelConverter
510
import models._
611
import org.junit.runner.RunWith
712
import org.scalatest.junit.JUnitRunner
@@ -92,6 +97,17 @@ class ModelPropertyParserTest extends FlatSpec with Matchers {
9297
optBigDecimal.getRequired should be (false)
9398
}
9499

100+
it should "process Model with Scala Option Boolean" in {
101+
val converter = ModelConverters.getInstance()
102+
val schemas = converter.readAll(classOf[ModelWOptionBoolean]).asScala.toMap
103+
val model = schemas.get("ModelWOptionBoolean")
104+
model should be ('defined)
105+
val optBoolean = model.get.getProperties().get("optBoolean")
106+
optBoolean should not be (null)
107+
optBoolean shouldBe a [properties.ObjectProperty]
108+
optBoolean.getRequired should be (false)
109+
}
110+
95111
it should "process all properties as required barring Option[_] or if overridden in annotation" in {
96112
val schemas = ModelConverters
97113
.getInstance()
@@ -114,6 +130,23 @@ class ModelPropertyParserTest extends FlatSpec with Matchers {
114130
forcedOptional.getRequired should be (false)
115131
}
116132

133+
it should "handle null properties from converters later in the chain" in {
134+
object CustomConverter extends ModelConverter {
135+
def resolve(`type`: Type, context: ModelConverterContext, chain: util.Iterator[ModelConverter]): Model = {
136+
if (chain.hasNext) chain.next().resolve(`type`, context, chain) else null
137+
}
138+
139+
def resolveProperty(`type`: Type, context: ModelConverterContext, annotations: Array[Annotation], chain: util.Iterator[ModelConverter]): Property = {
140+
null
141+
}
142+
}
143+
144+
val converter = new ModelConverters()
145+
converter.addConverter(CustomConverter)
146+
converter.addConverter(new SwaggerScalaModelConverter)
147+
converter.readAll(classOf[Option[Int]])
148+
}
149+
117150
def findModel(schemas: Map[String, Model], name: String): Option[Model] = {
118151
schemas.get(name) match {
119152
case Some(m) => Some(m)

src/test/scala/ScalaModelTest.scala

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -48,20 +48,29 @@ class ScalaModelTest extends FlatSpec with Matchers {
4848
val friends = model.getProperties().get("friends")
4949
friends.isInstanceOf[ArrayProperty] should be (true)
5050
}
51-
51+
5252
it should "read a model with vector of ints" in {
5353
val schemas = ModelConverters.getInstance().readAll(classOf[ModelWithIntVector]).asScala
5454
val model = schemas("ModelWithIntVector")
5555
val prop = model.getProperties().get("ints")
5656
prop.isInstanceOf[ArrayProperty] should be (true)
57-
prop.asInstanceOf[ArrayProperty].getItems.getType should be ("number")
57+
prop.asInstanceOf[ArrayProperty].getItems.getType should be ("object")
58+
}
59+
60+
it should "read a model with vector of booleans" in {
61+
val schemas = ModelConverters.getInstance().readAll(classOf[ModelWithBooleanVector]).asScala
62+
val model = schemas("ModelWithBooleanVector")
63+
val prop = model.getProperties().get("bools")
64+
prop.isInstanceOf[ArrayProperty] should be (true)
65+
prop.asInstanceOf[ArrayProperty].getItems.getType should be ("object")
5866
}
5967
}
6068

6169
case class ModelWithVector (
6270
name: String,
6371
friends: Vector[String])
64-
72+
6573
case class ModelWithIntVector (ints: Vector[Int])
74+
case class ModelWithBooleanVector (bools: Vector[Boolean])
6675

6776
case class SimpleUser (id: Long, name: String, @(ApiModelProperty @field)(value = "the birthdate") date: java.util.Date)
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package models
2+
3+
import io.swagger.annotations.ApiModelProperty
4+
5+
import scala.annotation.meta.field
6+
7+
case class ModelWOptionBoolean(
8+
@(ApiModelProperty @field)(value="this is an Option[Boolean] attribute") optBoolean: Option[Boolean])

0 commit comments

Comments
 (0)