From f883c5e77c1d96be25c3f7c526c8067e13aa5414 Mon Sep 17 00:00:00 2001 From: Rob Blair Date: Wed, 27 Nov 2013 14:18:35 -0800 Subject: [PATCH 1/6] issues/91 - allow enum and min/max to be used in templates MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * parse numeric min / max values, include in parameters * pass along the allowable values in the model used by templates * ensure ‘hasMore’ is set for more parameter lists used by templates * java model now includes min / max in comment, and allowed enum values as model children * note: enums in spec can contain non-java characters, so the User.java in examples does not compile presently. --- src/main/resources/Java/model.mustache | 6 ++++++ .../com/wordnik/swagger/codegen/Codegen.scala | 19 +++++++++++++++++++ .../model/SwaggerModelSerializer.scala | 6 ++++++ 3 files changed, 31 insertions(+) diff --git a/src/main/resources/Java/model.mustache b/src/main/resources/Java/model.mustache index f4472d46897..f900853c264 100644 --- a/src/main/resources/Java/model.mustache +++ b/src/main/resources/Java/model.mustache @@ -10,6 +10,12 @@ public class {{classname}} { {{#description}}/* {{{description}}} */ {{/description}} private {{{datatype}}} {{name}} = {{{defaultValue}}}; + {{#allowableValues}}{{#min}} // range from {{min}} to {{max}} + {{/min}} + {{^min}}public enum {{name}}Enum { {{#values}} {{.}}, {{/values}} }; + {{/min}} + {{/allowableValues}} + {{/vars}} {{#vars}} diff --git a/src/main/scala/com/wordnik/swagger/codegen/Codegen.scala b/src/main/scala/com/wordnik/swagger/codegen/Codegen.scala index d78bae95110..fb72f1e4a9a 100644 --- a/src/main/scala/com/wordnik/swagger/codegen/Codegen.scala +++ b/src/main/scala/com/wordnik/swagger/codegen/Codegen.scala @@ -188,6 +188,19 @@ class Codegen(config: CodegenConfig) { (srcName, engine -> template) } + def rawAllowableValuesToString(v: AllowableValues) = { + v match { + case av: AllowableListValues => { + av + } + case av: AllowableRangeValues => { + av + } + case _ => None + } + } + + def allowableValuesToString(v: AllowableValues) = { v match { case av: AllowableListValues => { @@ -306,6 +319,11 @@ class Codegen(config: CodegenConfig) { case _ => requiredParams.last.asInstanceOf[HashMap[String, String]] -= "hasMore" } + headerParams.size match { + case 0 => + case _ => headerParams.last.asInstanceOf[HashMap[String, String]] -= "hasMore" + } + queryParams.size match { case 0 => case _ => queryParams.last.asInstanceOf[HashMap[String, String]] -= "hasMore" @@ -466,6 +484,7 @@ class Codegen(config: CodegenConfig) { "defaultValue" -> config.toDeclaration(propertyDocSchema)._2, "description" -> propertyDocSchema.description, "notes" -> propertyDocSchema.description, + "allowableValues" -> rawAllowableValuesToString(propertyDocSchema.allowableValues), (if(propertyDocSchema.required) "required" else "isNotRequired") -> "true", "getter" -> config.toGetter(prop._1, config.toDeclaration(propertyDocSchema)._1), "setter" -> config.toSetter(prop._1, config.toDeclaration(propertyDocSchema)._1), diff --git a/src/main/scala/com/wordnik/swagger/model/SwaggerModelSerializer.scala b/src/main/scala/com/wordnik/swagger/model/SwaggerModelSerializer.scala index 8b63333f07d..a4cf37632a3 100644 --- a/src/main/scala/com/wordnik/swagger/model/SwaggerModelSerializer.scala +++ b/src/main/scala/com/wordnik/swagger/model/SwaggerModelSerializer.scala @@ -347,10 +347,16 @@ object SwaggerSerializers { else { val min = (json \ "min") match { case e: JObject => e.extract[String] + case e: JString => e.s + case e: JInt => e.num.toString + case e: JDouble => e.num.toString case _ => "" } val max = (json \ "max") match { case e: JObject => e.extract[String] + case e: JString => e.s + case e: JInt => e.num.toString + case e: JDouble => e.num.toString case _ => "" } if(min != "" && max != "") From 3a8928f8697d378eb76eedec72dfe8e9a306ef38 Mon Sep 17 00:00:00 2001 From: Rob Blair Date: Wed, 27 Nov 2013 14:19:56 -0800 Subject: [PATCH 2/6] issues/91 - regenerate petstore java files --- .../java/src/main/java/com/wordnik/petstore/model/Order.java | 1 + .../java/src/main/java/com/wordnik/petstore/model/Pet.java | 1 + .../java/src/main/java/com/wordnik/petstore/model/User.java | 1 + 3 files changed, 3 insertions(+) diff --git a/samples/client/petstore/java/src/main/java/com/wordnik/petstore/model/Order.java b/samples/client/petstore/java/src/main/java/com/wordnik/petstore/model/Order.java index 6b6c23d79ae..159ad1b155e 100644 --- a/samples/client/petstore/java/src/main/java/com/wordnik/petstore/model/Order.java +++ b/samples/client/petstore/java/src/main/java/com/wordnik/petstore/model/Order.java @@ -10,6 +10,7 @@ public class Order { private Integer quantity = null; /* Status of the order */ private String status = null; + public enum statusEnum { placed, approved, delivered, }; /* Date shipped, only if it has been */ private Date shipDate = null; public Long getId() { diff --git a/samples/client/petstore/java/src/main/java/com/wordnik/petstore/model/Pet.java b/samples/client/petstore/java/src/main/java/com/wordnik/petstore/model/Pet.java index 7220a93d98a..9101260b268 100644 --- a/samples/client/petstore/java/src/main/java/com/wordnik/petstore/model/Pet.java +++ b/samples/client/petstore/java/src/main/java/com/wordnik/petstore/model/Pet.java @@ -16,6 +16,7 @@ public class Pet { private List tags = new ArrayList(); /* pet status in the store */ private String status = null; + public enum statusEnum { available, pending, sold, }; public Long getId() { return id; } diff --git a/samples/client/petstore/java/src/main/java/com/wordnik/petstore/model/User.java b/samples/client/petstore/java/src/main/java/com/wordnik/petstore/model/User.java index d2e09da239b..17a3665fd7a 100644 --- a/samples/client/petstore/java/src/main/java/com/wordnik/petstore/model/User.java +++ b/samples/client/petstore/java/src/main/java/com/wordnik/petstore/model/User.java @@ -17,6 +17,7 @@ public class User { private String phone = null; /* User Status */ private Integer userStatus = null; + public enum userStatusEnum { 1-registered, 2-active, 3-closed, }; public Long getId() { return id; } From 830ad87fcb9ea73fa5e0de15e5554a2094e9a581 Mon Sep 17 00:00:00 2001 From: Robert Blair Date: Wed, 27 Nov 2013 18:03:57 -0800 Subject: [PATCH 3/6] issues/91 - enum in model commented out by default --- src/main/resources/Java/model.mustache | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/Java/model.mustache b/src/main/resources/Java/model.mustache index f900853c264..d3b7b4b5247 100644 --- a/src/main/resources/Java/model.mustache +++ b/src/main/resources/Java/model.mustache @@ -12,7 +12,7 @@ public class {{classname}} { private {{{datatype}}} {{name}} = {{{defaultValue}}}; {{#allowableValues}}{{#min}} // range from {{min}} to {{max}} {{/min}} - {{^min}}public enum {{name}}Enum { {{#values}} {{.}}, {{/values}} }; + //{{^min}}public enum {{name}}Enum { {{#values}} {{.}}, {{/values}} }; {{/min}} {{/allowableValues}} From 90c14fd116bab0c1516a46a5c1ef22647e57d372 Mon Sep 17 00:00:00 2001 From: Robert Blair Date: Wed, 27 Nov 2013 20:04:57 -0800 Subject: [PATCH 4/6] issue/91 - and also check in the generated fils --- .../java/src/main/java/com/wordnik/client/ApiInvoker.java | 3 ++- .../java/src/main/java/com/wordnik/petstore/model/Order.java | 2 +- .../java/src/main/java/com/wordnik/petstore/model/Pet.java | 2 +- .../java/src/main/java/com/wordnik/petstore/model/User.java | 2 +- 4 files changed, 5 insertions(+), 4 deletions(-) diff --git a/samples/client/petstore/java/src/main/java/com/wordnik/client/ApiInvoker.java b/samples/client/petstore/java/src/main/java/com/wordnik/client/ApiInvoker.java index 955ffe39f6e..781e7da6981 100644 --- a/samples/client/petstore/java/src/main/java/com/wordnik/client/ApiInvoker.java +++ b/samples/client/petstore/java/src/main/java/com/wordnik/client/ApiInvoker.java @@ -12,6 +12,7 @@ import com.sun.jersey.api.client.config.DefaultClientConfig; import com.sun.jersey.api.client.filter.LoggingFilter; import com.sun.jersey.api.client.WebResource.Builder; +import javax.ws.rs.core.Response.Status.Family; import javax.ws.rs.core.MediaType; import java.util.Map; @@ -123,7 +124,7 @@ public class ApiInvoker { else { throw new ApiException(500, "unknown method type " + method); } - if(response.getClientResponseStatus() == ClientResponse.Status.OK) { + if(response.getClientResponseStatus().getFamily() == Family.SUCCESSFUL) { return (String) response.getEntity(String.class); } else { diff --git a/samples/client/petstore/java/src/main/java/com/wordnik/petstore/model/Order.java b/samples/client/petstore/java/src/main/java/com/wordnik/petstore/model/Order.java index 159ad1b155e..cc462a953ae 100644 --- a/samples/client/petstore/java/src/main/java/com/wordnik/petstore/model/Order.java +++ b/samples/client/petstore/java/src/main/java/com/wordnik/petstore/model/Order.java @@ -10,7 +10,7 @@ public class Order { private Integer quantity = null; /* Status of the order */ private String status = null; - public enum statusEnum { placed, approved, delivered, }; + //public enum statusEnum { placed, approved, delivered, }; /* Date shipped, only if it has been */ private Date shipDate = null; public Long getId() { diff --git a/samples/client/petstore/java/src/main/java/com/wordnik/petstore/model/Pet.java b/samples/client/petstore/java/src/main/java/com/wordnik/petstore/model/Pet.java index 9101260b268..99f0c088fb4 100644 --- a/samples/client/petstore/java/src/main/java/com/wordnik/petstore/model/Pet.java +++ b/samples/client/petstore/java/src/main/java/com/wordnik/petstore/model/Pet.java @@ -16,7 +16,7 @@ public class Pet { private List tags = new ArrayList(); /* pet status in the store */ private String status = null; - public enum statusEnum { available, pending, sold, }; + //public enum statusEnum { available, pending, sold, }; public Long getId() { return id; } diff --git a/samples/client/petstore/java/src/main/java/com/wordnik/petstore/model/User.java b/samples/client/petstore/java/src/main/java/com/wordnik/petstore/model/User.java index 17a3665fd7a..23535b05cd3 100644 --- a/samples/client/petstore/java/src/main/java/com/wordnik/petstore/model/User.java +++ b/samples/client/petstore/java/src/main/java/com/wordnik/petstore/model/User.java @@ -17,7 +17,7 @@ public class User { private String phone = null; /* User Status */ private Integer userStatus = null; - public enum userStatusEnum { 1-registered, 2-active, 3-closed, }; + //public enum userStatusEnum { 1-registered, 2-active, 3-closed, }; public Long getId() { return id; } From a7b78a6210259246b19c3e7bf8f3fec21e246a2f Mon Sep 17 00:00:00 2001 From: Robert Blair Date: Wed, 27 Nov 2013 20:30:31 -0800 Subject: [PATCH 5/6] add script to run all the sample build scripts --- bin/all-petstore.sh | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100755 bin/all-petstore.sh diff --git a/bin/all-petstore.sh b/bin/all-petstore.sh new file mode 100755 index 00000000000..716db5bae15 --- /dev/null +++ b/bin/all-petstore.sh @@ -0,0 +1,37 @@ +#!/bin/sh + +SCRIPT="$0" + +while [ -h "$SCRIPT" ] ; do + ls=`ls -ld "$SCRIPT"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + SCRIPT="$link" + else + SCRIPT=`dirname "$SCRIPT"`/"$link" + fi +done + +if [ ! -d "${APP_DIR}" ]; then + APP_DIR=`dirname "$SCRIPT"`/.. + APP_DIR=`cd "${APP_DIR}"; pwd` +fi + +cd $APP_DIR +./bin/java-wordnik-api.sh +./bin/php-wordnik-api.sh +./bin/python3-wordnik-api.sh +./bin/objc-wordnik-api.sh +./bin/python-wordnik-api.sh +./bin/scala-wordnik-api.sh + +./bin/android-java-petstore.sh +./bin/csharp-petstore.sh +./bin/flash-petstore.sh +./bin/java-petstore.sh +./bin/objc-petstore.sh +./bin/php-petstore.sh +./bin/python-petstore.sh +./bin/python3-petstore.sh +./bin/ruby-petstore.sh +./bin/scala-petstore.sh From 1b8bb4a0a6d46dbd1e072dbb0a75f11e02ae193a Mon Sep 17 00:00:00 2001 From: Tony Tam Date: Thu, 28 Nov 2013 13:28:26 -1000 Subject: [PATCH 6/6] rebuilt client --- build.sbt | 2 +- .../java/com/wordnik/client/common/ApiInvoker.java | 3 ++- .../scala/com/wordnik/client/api/AccountApi.scala | 4 ++-- .../scala/com/wordnik/client/api/WordApi.scala | 14 +++++++------- .../scala/com/wordnik/client/api/WordListApi.scala | 2 +- .../scala/com/wordnik/client/api/WordsApi.scala | 2 +- .../com/wordnik/client/model/Definition.scala | 8 ++++---- .../scala/com/wordnik/client/model/Example.scala | 2 +- .../com/wordnik/client/model/WordOfTheDay.scala | 2 +- 9 files changed, 20 insertions(+), 19 deletions(-) diff --git a/build.sbt b/build.sbt index 8ce46eac954..70b80d23b1a 100644 --- a/build.sbt +++ b/build.sbt @@ -7,7 +7,7 @@ name := "swagger-codegen" version := "2.0.11" -scalaVersion := "2.9.1" +scalaVersion := "2.10.0" javacOptions ++= Seq("-target", "1.6", "-source", "1.6", "-Xlint:unchecked", "-Xlint:deprecation") diff --git a/samples/client/wordnik-api/java/src/main/java/com/wordnik/client/common/ApiInvoker.java b/samples/client/wordnik-api/java/src/main/java/com/wordnik/client/common/ApiInvoker.java index 8344a2ab37f..04f65f0ea94 100644 --- a/samples/client/wordnik-api/java/src/main/java/com/wordnik/client/common/ApiInvoker.java +++ b/samples/client/wordnik-api/java/src/main/java/com/wordnik/client/common/ApiInvoker.java @@ -12,6 +12,7 @@ import com.sun.jersey.api.client.config.DefaultClientConfig; import com.sun.jersey.api.client.filter.LoggingFilter; import com.sun.jersey.api.client.WebResource.Builder; +import javax.ws.rs.core.Response.Status.Family; import javax.ws.rs.core.MediaType; import java.util.Map; @@ -123,7 +124,7 @@ public class ApiInvoker { else { throw new ApiException(500, "unknown method type " + method); } - if(response.getClientResponseStatus() == ClientResponse.Status.OK) { + if(response.getClientResponseStatus().getFamily() == Family.SUCCESSFUL) { return (String) response.getEntity(String.class); } else { diff --git a/samples/client/wordnik-api/scala/src/main/scala/com/wordnik/client/api/AccountApi.scala b/samples/client/wordnik-api/scala/src/main/scala/com/wordnik/client/api/AccountApi.scala index ca4e6e9fe08..a5dd0901880 100644 --- a/samples/client/wordnik-api/scala/src/main/scala/com/wordnik/client/api/AccountApi.scala +++ b/samples/client/wordnik-api/scala/src/main/scala/com/wordnik/client/api/AccountApi.scala @@ -1,8 +1,8 @@ package com.wordnik.client.api -import com.wordnik.client.model.ApiTokenStatus -import com.wordnik.client.model.WordList import com.wordnik.client.model.User +import com.wordnik.client.model.WordList +import com.wordnik.client.model.ApiTokenStatus import com.wordnik.client.model.AuthenticationToken import com.wordnik.client.common.ApiInvoker import com.wordnik.client.common.ApiException diff --git a/samples/client/wordnik-api/scala/src/main/scala/com/wordnik/client/api/WordApi.scala b/samples/client/wordnik-api/scala/src/main/scala/com/wordnik/client/api/WordApi.scala index de8f3d0348c..cab9db7e07a 100644 --- a/samples/client/wordnik-api/scala/src/main/scala/com/wordnik/client/api/WordApi.scala +++ b/samples/client/wordnik-api/scala/src/main/scala/com/wordnik/client/api/WordApi.scala @@ -1,16 +1,16 @@ package com.wordnik.client.api -import com.wordnik.client.model.Definition +import com.wordnik.client.model.FrequencySummary +import com.wordnik.client.model.Bigram +import com.wordnik.client.model.WordObject +import com.wordnik.client.model.ExampleSearchResults +import com.wordnik.client.model.Example import com.wordnik.client.model.ScrabbleScoreResult import com.wordnik.client.model.TextPron -import com.wordnik.client.model.Example import com.wordnik.client.model.Syllable -import com.wordnik.client.model.AudioFile -import com.wordnik.client.model.ExampleSearchResults -import com.wordnik.client.model.WordObject -import com.wordnik.client.model.Bigram import com.wordnik.client.model.Related -import com.wordnik.client.model.FrequencySummary +import com.wordnik.client.model.Definition +import com.wordnik.client.model.AudioFile import com.wordnik.client.common.ApiInvoker import com.wordnik.client.common.ApiException diff --git a/samples/client/wordnik-api/scala/src/main/scala/com/wordnik/client/api/WordListApi.scala b/samples/client/wordnik-api/scala/src/main/scala/com/wordnik/client/api/WordListApi.scala index 3b51e692c24..bc4124f6c2a 100644 --- a/samples/client/wordnik-api/scala/src/main/scala/com/wordnik/client/api/WordListApi.scala +++ b/samples/client/wordnik-api/scala/src/main/scala/com/wordnik/client/api/WordListApi.scala @@ -1,8 +1,8 @@ package com.wordnik.client.api +import com.wordnik.client.model.WordListWord import com.wordnik.client.model.WordList import com.wordnik.client.model.StringValue -import com.wordnik.client.model.WordListWord import com.wordnik.client.common.ApiInvoker import com.wordnik.client.common.ApiException diff --git a/samples/client/wordnik-api/scala/src/main/scala/com/wordnik/client/api/WordsApi.scala b/samples/client/wordnik-api/scala/src/main/scala/com/wordnik/client/api/WordsApi.scala index 92e9fac23b7..a5b96d4f3f2 100644 --- a/samples/client/wordnik-api/scala/src/main/scala/com/wordnik/client/api/WordsApi.scala +++ b/samples/client/wordnik-api/scala/src/main/scala/com/wordnik/client/api/WordsApi.scala @@ -1,7 +1,7 @@ package com.wordnik.client.api -import com.wordnik.client.model.WordObject import com.wordnik.client.model.DefinitionSearchResults +import com.wordnik.client.model.WordObject import com.wordnik.client.model.WordOfTheDay import com.wordnik.client.model.WordSearchResults import com.wordnik.client.common.ApiInvoker diff --git a/samples/client/wordnik-api/scala/src/main/scala/com/wordnik/client/model/Definition.scala b/samples/client/wordnik-api/scala/src/main/scala/com/wordnik/client/model/Definition.scala index 67d29195bf3..9f2996d793c 100644 --- a/samples/client/wordnik-api/scala/src/main/scala/com/wordnik/client/model/Definition.scala +++ b/samples/client/wordnik-api/scala/src/main/scala/com/wordnik/client/model/Definition.scala @@ -1,11 +1,11 @@ package com.wordnik.client.model -import com.wordnik.client.model.ExampleUsage -import com.wordnik.client.model.Note -import com.wordnik.client.model.Citation -import com.wordnik.client.model.TextPron import com.wordnik.client.model.Label +import com.wordnik.client.model.ExampleUsage +import com.wordnik.client.model.TextPron +import com.wordnik.client.model.Citation import com.wordnik.client.model.Related +import com.wordnik.client.model.Note case class Definition ( extendedText: String, text: String, diff --git a/samples/client/wordnik-api/scala/src/main/scala/com/wordnik/client/model/Example.scala b/samples/client/wordnik-api/scala/src/main/scala/com/wordnik/client/model/Example.scala index 3d3e45996a2..349ec7e70a5 100644 --- a/samples/client/wordnik-api/scala/src/main/scala/com/wordnik/client/model/Example.scala +++ b/samples/client/wordnik-api/scala/src/main/scala/com/wordnik/client/model/Example.scala @@ -1,8 +1,8 @@ package com.wordnik.client.model import com.wordnik.client.model.Sentence -import com.wordnik.client.model.ScoredWord import com.wordnik.client.model.ContentProvider +import com.wordnik.client.model.ScoredWord case class Example ( id: Long, exampleId: Long, diff --git a/samples/client/wordnik-api/scala/src/main/scala/com/wordnik/client/model/WordOfTheDay.scala b/samples/client/wordnik-api/scala/src/main/scala/com/wordnik/client/model/WordOfTheDay.scala index 3c64a66571b..dccf9403f2d 100644 --- a/samples/client/wordnik-api/scala/src/main/scala/com/wordnik/client/model/WordOfTheDay.scala +++ b/samples/client/wordnik-api/scala/src/main/scala/com/wordnik/client/model/WordOfTheDay.scala @@ -1,8 +1,8 @@ package com.wordnik.client.model import java.util.Date -import com.wordnik.client.model.SimpleDefinition import com.wordnik.client.model.SimpleExample +import com.wordnik.client.model.SimpleDefinition import com.wordnik.client.model.ContentProvider case class WordOfTheDay ( id: Long,