Navigation Menu

Skip to content

Commit

Permalink
also add apioperation and parameter methods that use a swaggermodel d…
Browse files Browse the repository at this point in the history
…eclaration directly
  • Loading branch information
casualjim committed Feb 4, 2013
1 parent a253b64 commit 2dee208
Show file tree
Hide file tree
Showing 2 changed files with 76 additions and 21 deletions.
31 changes: 27 additions & 4 deletions swagger-ext/src/main/scala/org/scalatra/swagger/SwaggerAuth.scala
Expand Up @@ -84,13 +84,33 @@ object AuthApi {

lazy val Iso8601Date = ISODateTimeFormat.dateTime.withZone(DateTimeZone.UTC)

class AuthOperationBuilder[T <: AnyRef, M: Manifest](val models: mutable.Map[String, Model], protected val defaultErrors: List[Error]) extends SwaggerOperationBuilder[AuthOperation[T]] {
registerModel[M]
val resultClass: String = DataType[M].name
trait SwaggerAuthOperationBuilder[T <: AnyRef] extends SwaggerOperationBuilder[AuthOperation[T]] {
private[this] var _allows: Option[T] => Boolean = (u: Option[T]) => true
def allows: Option[T] => Boolean = _allows
def allows(guard: Option[T] => Boolean): this.type = { _allows = guard; this }
def allowAll: this.type = { _allows = (u: Option[T]) => true; this }
}
class AuthOperationBuilder[T <: AnyRef, M: Manifest](val models: mutable.Map[String, Model], protected val defaultErrors: List[Error]) extends SwaggerAuthOperationBuilder[T] {
registerModel[M]
val resultClass: String = DataType[M].name

def result: AuthOperation[T] = AuthOperation[T](
null,
resultClass,
summary,
notes,
deprecated,
nickname,
parameters,
errorResponses ::: defaultErrors,
allows
)
}

class ModelAuthOperationBuilder[T <: AnyRef](val models: mutable.Map[String, Model], protected val defaultErrors: List[Error], model: Model) extends SwaggerAuthOperationBuilder[T] {
models += model.id -> model
val resultClass: String = model.id

def result: AuthOperation[T] = AuthOperation[T](
null,
resultClass,
Expand Down Expand Up @@ -167,12 +187,15 @@ trait SwaggerAuthSupport[TypeForUser <: AnyRef] extends SwaggerSupportBase with

private def allowAll = (u: Option[TypeForUser]) => true

protected implicit def operationBuilder2operation[T:Manifest](bldr: AuthApi.AuthOperationBuilder[TypeForUser, T]): AuthOperation[TypeForUser] =
protected implicit def operationBuilder2operation[T:Manifest](bldr: AuthApi.SwaggerAuthOperationBuilder[TypeForUser]): AuthOperation[TypeForUser] =
bldr.result

protected def apiOperation[T: Manifest](nickname: String): AuthApi.AuthOperationBuilder[TypeForUser, T] =
new AuthApi.AuthOperationBuilder[TypeForUser, T](_models, swaggerDefaultErrors).nickname(nickname)

protected def apiOperation(nickname: String, model: Model): AuthApi.ModelAuthOperationBuilder[TypeForUser] =
new AuthApi.ModelAuthOperationBuilder[TypeForUser](_models, swaggerDefaultErrors, model).nickname(nickname)


/**
* Builds the documentation for all the endpoints discovered in an API.
Expand Down
66 changes: 49 additions & 17 deletions swagger/src/main/scala/org/scalatra/swagger/SwaggerSupport.scala
Expand Up @@ -130,32 +130,26 @@ object SwaggerSupportSyntax {
}


class ParameterBuilder[T:Manifest](models: mutable.Map[String, Model]) {
trait SwaggerParameterBuilder {


registerModel[T]

private[this] var _name: String = _
private[this] var _description: String = ""
private[this] val dataType: DataType.DataType = DataType[T]

private[this] var _notes: Option[String] = None
private[this] var _paramType: ParamType.ParamType = ParamType.Query
private[this] var _defaultValue: Option[String] = None

private[this] var _allowableValues: AllowableValues = AllowableValues.AnyValue
private[this] var _required: Boolean = true

protected def registerModel[R:Manifest]() {
models ++= Swagger.collectModels[R](models.values.toSet).map(m => m.id -> m)
}

def dataType: DataType.DataType
def name(name: String): this.type = { _name = name; this }
def description(description: String): this.type = { _description = description; this }

def notes(notes: String): this.type = { _notes = notes.blankOption; this }
def paramType(name: ParamType.ParamType): this.type = { _paramType = name; this }
def defaultValue(value: T): this.type = {
_defaultValue = allCatch.withApply(_ => None){ value.toString.blankOption }
this
}

def allowableValues[V](values: V*): this.type = {
_allowableValues = if (values.isEmpty) AllowableValues.empty else AllowableValues(values:_*)
this
Expand All @@ -167,12 +161,12 @@ object SwaggerSupportSyntax {
def allowableValues(values: Range): this.type = { _allowableValues = AllowableValues(values); this }
def required: this.type = { _required = true; this }
def optional: this.type = { _required = false; this }

def defaultValue: Option[String] = None
def name: String = _name
def description: String = _description
def notes: Option[String] = _notes
def paramType: ParamType.ParamType = _paramType
def defaultValue: Option[String] = _defaultValue

def allowableValues: AllowableValues = _allowableValues
def isRequired: Boolean = _required
def allowsMultiple: Boolean = {
Expand All @@ -184,6 +178,25 @@ object SwaggerSupportSyntax {
Parameter(name, description, dataType, notes, paramType, defaultValue, allowableValues, isRequired, allowsMultiple)
}

class ParameterBuilder[T:Manifest](models: mutable.Map[String, Model]) extends SwaggerParameterBuilder {
registerModel[T]
private[this] var _defaultValue: Option[String] = None
val dataType: DataType.DataType = DataType[T]
override def defaultValue = _defaultValue
protected def registerModel[R:Manifest]() {
models ++= Swagger.collectModels[R](models.values.toSet).map(m => m.id -> m)
}
def defaultValue(value: T): this.type = {
_defaultValue = allCatch.withApply(_ => None){ value.toString.blankOption }
this
}
}

class ModelParameterBuilder(models: mutable.Map[String, Model], model: Model) extends SwaggerParameterBuilder {
models += model.id -> model
val dataType: DataType.DataType = DataType(model.id)
}

trait SwaggerOperationBuilder[T <: SwaggerOperation] {
def models: mutable.Map[String, Model]
protected def defaultErrors: List[Error]
Expand Down Expand Up @@ -239,6 +252,20 @@ object SwaggerSupportSyntax {
parameters,
errorResponses ::: defaultErrors)
}

class ModelOperationBuilder(val models: mutable.Map[String, Model], protected val defaultErrors: List[Error], model: Model) extends SwaggerOperationBuilder[Operation] {
models += model.id -> model
val resultClass: String = model.id
def result: Operation = Operation(
null,
resultClass,
summary,
notes,
deprecated,
nickname,
parameters,
errorResponses ::: defaultErrors)
}
}
trait SwaggerSupportSyntax extends Initializable with CorsSupport { this: ScalatraBase with SwaggerSupportBase =>
protected implicit def swagger: SwaggerEngine[_]
Expand Down Expand Up @@ -377,8 +404,11 @@ trait SwaggerSupportSyntax extends Initializable with CorsSupport { this: Scalat

import SwaggerSupportSyntax._
protected def apiOperation[T: Manifest](nickname: String): SwaggerOperationBuilder[_ <: SwaggerOperation]
implicit def parameterBuilder2parameter[T](pmb: ParameterBuilder[T]): Parameter = pmb.result
protected def parameter[T: Manifest](name: String) = new ParameterBuilder(_models).name(name)
implicit def parameterBuilder2parameter(pmb: SwaggerParameterBuilder): Parameter = pmb.result
protected def parameter[T: Manifest](name: String): ParameterBuilder[T] =
new ParameterBuilder(_models).name(name)
protected def parameter(name: String, model: Model): ModelParameterBuilder =
new ModelParameterBuilder(_models, model).name(name)
protected def operation(op: SwaggerOperation) = swaggerMeta(Symbols.Operation, op)


Expand All @@ -405,9 +435,11 @@ trait SwaggerSupport extends ScalatraBase with SwaggerSupportBase with SwaggerSu

import SwaggerSupportSyntax._

protected implicit def operationBuilder2operation[T](bldr: OperationBuilder[T]): Operation = bldr.result
protected implicit def operationBuilder2operation[T](bldr: SwaggerOperationBuilder[Operation]): Operation = bldr.result
protected def apiOperation[T: Manifest](nickname: String): OperationBuilder[T] =
new OperationBuilder[T](_models, swaggerDefaultErrors).nickname(nickname)
protected def apiOperation(nickname: String, model: Model): ModelOperationBuilder =
new ModelOperationBuilder(_models, swaggerDefaultErrors, model).nickname(nickname)

/**
* Builds the documentation for all the endpoints discovered in an API.
Expand Down

0 comments on commit 2dee208

Please sign in to comment.