diff --git a/src/main/scala/com/wordnik/swagger/codegen/BasicGenerator.scala b/src/main/scala/com/wordnik/swagger/codegen/BasicGenerator.scala index 676bc603f868..5f25f989f247 100644 --- a/src/main/scala/com/wordnik/swagger/codegen/BasicGenerator.scala +++ b/src/main/scala/com/wordnik/swagger/codegen/BasicGenerator.scala @@ -84,16 +84,43 @@ abstract class BasicGenerator extends CodegenConfig with PathUtil { if (apis == null) throw new Exception("No APIs specified by resource") val subDocs = ApiExtractor.extractApiDocs(basePath, apis.toList, apiKey) - - val models = CoreUtils.extractAllModels(subDocs) + // val models = CoreUtils.extractAllModels(subDocs) new SwaggerSpecValidator(doc, subDocs).validate() val allModels = new HashMap[String, DocumentationSchema] - val operations = extractOperations(subDocs, allModels) - val apiMap = groupApisToFiles(operations) + + processApiMap(apiMap) + processModelMap(allModels) + + codegen.writeSupportingClasses(apiMap.toMap, allModels.toMap) + } + + def processModelMap(models: HashMap[String, DocumentationSchema]) = { + val modelBundleList = new ListBuffer[Map[String, AnyRef]] + for ((name, schema) <- models) { + if (!defaultIncludes.contains(name)) { + val m = new HashMap[String, AnyRef] + m += "name" -> name + m += "className" -> name + m += "apis" -> None + m += "models" -> List((name, schema)) + m += "package" -> modelPackage + m += "invokerPackage" -> invokerPackage + m += "outputDirectory" -> (destinationDir + File.separator + modelPackage.getOrElse("").replaceAll("\\.", File.separator)) + m += "newline" -> "\n" + modelBundleList += m.toMap + for ((file, suffix) <- modelTemplateFiles) { + m += "filename" -> (name + suffix) + generateAndWrite(m.toMap, file) + } + } + } + } + + def processApiMap(apiMap: Map[(String, String), List[(String, DocumentationOperation)]] ) = { for ((identifier, operationList) <- apiMap) { val basePath = identifier._1 val name = identifier._2 @@ -115,27 +142,6 @@ abstract class BasicGenerator extends CodegenConfig with PathUtil { generateAndWrite(m.toMap, file) } } - - val modelBundleList = new ListBuffer[Map[String, AnyRef]] - for ((name, schema) <- allModels) { - if (!defaultIncludes.contains(name)) { - val m = new HashMap[String, AnyRef] - m += "name" -> name - m += "className" -> name - m += "apis" -> None - m += "models" -> List((name, schema)) - m += "package" -> modelPackage - m += "invokerPackage" -> invokerPackage - m += "outputDirectory" -> (destinationDir + File.separator + modelPackage.getOrElse("").replaceAll("\\.", File.separator)) - m += "newline" -> "\n" - modelBundleList += m.toMap - for ((file, suffix) <- modelTemplateFiles) { - m += "filename" -> (name + suffix) - generateAndWrite(m.toMap, file) - } - } - } - codegen.writeSupportingClasses(apiMap.toMap, allModels.toMap) } def generateAndWrite(bundle: Map[String, AnyRef], templateFile: String) = { @@ -150,7 +156,7 @@ abstract class BasicGenerator extends CodegenConfig with PathUtil { println("wrote " + filename) } - def groupApisToFiles(operations: List[(String /*basePath*/ , String /*apiPath*/ , DocumentationOperation /* operation*/ )]): Map[(String, String), ListBuffer[(String, DocumentationOperation)]] = { + def groupApisToFiles(operations: List[(String /*basePath*/ , String /*apiPath*/ , DocumentationOperation /* operation*/ )]): Map[(String, String), List[(String, DocumentationOperation)]] = { val opMap = new HashMap[(String, String), ListBuffer[(String, DocumentationOperation)]] for ((basePath, apiPath, operation) <- operations) { val className = resourceNameFromFullPath(apiPath) @@ -161,6 +167,6 @@ abstract class BasicGenerator extends CodegenConfig with PathUtil { }) listToAddTo += Tuple2(apiPath, operation) } - opMap.toMap + opMap.map(m => (m._1, m._2.toList)).toMap } } diff --git a/src/main/scala/com/wordnik/swagger/codegen/BasicScalaGenerator.scala b/src/main/scala/com/wordnik/swagger/codegen/BasicScalaGenerator.scala index 8e5427d61291..d7fac6ef1999 100644 --- a/src/main/scala/com/wordnik/swagger/codegen/BasicScalaGenerator.scala +++ b/src/main/scala/com/wordnik/swagger/codegen/BasicScalaGenerator.scala @@ -81,7 +81,7 @@ class BasicScalaGenerator extends BasicGenerator { val e = "java.util.List[%s]" format toDeclaredType(inner) (e, toDefaultValue(inner, obj)) } - case e: String => (e, toDefaultValue(e, obj)) + case e: String => (toDeclaredType(e), toDefaultValue(e, obj)) } } diff --git a/src/main/scala/com/wordnik/swagger/codegen/Codegen.scala b/src/main/scala/com/wordnik/swagger/codegen/Codegen.scala index 93cb38adae59..7eab5160ac6f 100644 --- a/src/main/scala/com/wordnik/swagger/codegen/Codegen.scala +++ b/src/main/scala/com/wordnik/swagger/codegen/Codegen.scala @@ -442,7 +442,7 @@ class Codegen(config: CodegenConfig) { } } - def writeSupportingClasses(apis: Map[(String, String), scala.collection.mutable.ListBuffer[(String, com.wordnik.swagger.core.DocumentationOperation)]], models: Map[String, DocumentationSchema]) = { + def writeSupportingClasses(apis: Map[(String, String), List[(String, com.wordnik.swagger.core.DocumentationOperation)]], models: Map[String, DocumentationSchema]) = { val rootDir = new java.io.File(".") val engine = new TemplateEngine(Some(rootDir)) diff --git a/src/test/scala/BasicGeneratorTest.scala b/src/test/scala/BasicGeneratorTest.scala index 103472bda795..51b1357d26bb 100644 --- a/src/test/scala/BasicGeneratorTest.scala +++ b/src/test/scala/BasicGeneratorTest.scala @@ -50,4 +50,27 @@ class BasicGeneratorTest extends FlatSpec with ShouldMatchers { orderApi.getParameters.size should be (1) orderApi.getErrorResponses.size should be (1) } + + it should "verify ops are grouped by path correctly" in { + val resourceListing = json.readValue(ResourceExtractor.extractListing("src/test/resources/petstore/resources.json", None), classOf[Documentation]) + val subDocs = ApiExtractor.extractApiDocs("src/test/resources/petstore", resourceListing.getApis.asScala.toList) + val allModels = new HashMap[String, DocumentationSchema]() + + implicit val basePath = "http://localhost:8080/api" + val generator = new SampleGenerator + val ops = generator.extractOperations(subDocs, allModels) + val apiMap = generator.groupApisToFiles(ops) + + // verify all apis are there + (apiMap.keys.map(m => m._2).toSet & Set("user", "pet", "store")).size should be (3) + + // inspect the store apis + val orderApis = apiMap("http://petstore.swagger.wordnik.com/api","store").groupBy(_._1).toMap + val orderOperations = orderApis("/store.{format}/order/{orderId}").map(m => m._2) + + // 2 operations + orderOperations.size should be (2) + (orderOperations.map(m => m.httpMethod).toSet & Set("GET", "DELETE")).size should be (2) + (orderOperations.map(m => m.nickname).toSet & Set("getOrderById", "deleteOrder")).size should be (2) + } }