Skip to content

Commit 95c033c

Browse files
committed
Merge pull request #2072 from delenius/promises
Add usePromise parameter to JS client
2 parents cabe003 + d56d626 commit 95c033c

File tree

22 files changed

+2527
-10
lines changed

22 files changed

+2527
-10
lines changed

bin/javascript-promise-petstore.sh

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
#!/bin/sh
2+
3+
SCRIPT="$0"
4+
5+
while [ -h "$SCRIPT" ] ; do
6+
ls=`ls -ld "$SCRIPT"`
7+
link=`expr "$ls" : '.*-> \(.*\)$'`
8+
if expr "$link" : '/.*' > /dev/null; then
9+
SCRIPT="$link"
10+
else
11+
SCRIPT=`dirname "$SCRIPT"`/"$link"
12+
fi
13+
done
14+
15+
if [ ! -d "${APP_DIR}" ]; then
16+
APP_DIR=`dirname "$SCRIPT"`/..
17+
APP_DIR=`cd "${APP_DIR}"; pwd`
18+
fi
19+
20+
executable="./modules/swagger-codegen-cli/target/swagger-codegen-cli.jar"
21+
22+
if [ ! -f "$executable" ]
23+
then
24+
mvn clean package
25+
fi
26+
27+
# if you've executed sbt assembly previously it will use that instead.
28+
export JAVA_OPTS="${JAVA_OPTS} -XX:MaxPermSize=256M -Xmx1024M -DloggerPath=conf/log4j.properties"
29+
ags="$@ generate -t modules/swagger-codegen/src/main/resources/javascript \
30+
-i modules/swagger-codegen/src/test/resources/2_0/petstore.json -l javascript \
31+
-o samples/client/petstore/javascript-promise \
32+
--additional-properties usePromises=true"
33+
34+
java -DappName=PetstoreClient $JAVA_OPTS -jar $executable $ags

modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JavascriptClientCodegen.java

Lines changed: 35 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,38 @@
11
package io.swagger.codegen.languages;
22

33
import com.google.common.base.Strings;
4-
import io.swagger.codegen.*;
5-
import io.swagger.models.*;
4+
5+
import io.swagger.codegen.CliOption;
6+
import io.swagger.codegen.CodegenConfig;
7+
import io.swagger.codegen.CodegenConstants;
8+
import io.swagger.codegen.CodegenModel;
9+
import io.swagger.codegen.CodegenOperation;
10+
import io.swagger.codegen.CodegenProperty;
11+
import io.swagger.codegen.CodegenType;
12+
import io.swagger.codegen.SupportingFile;
13+
import io.swagger.codegen.DefaultCodegen;
14+
import io.swagger.models.Info;
15+
import io.swagger.models.License;
16+
import io.swagger.models.Model;
17+
import io.swagger.models.Operation;
18+
import io.swagger.models.Swagger;
619
import io.swagger.models.properties.ArrayProperty;
720
import io.swagger.models.properties.MapProperty;
821
import io.swagger.models.properties.Property;
922
import io.swagger.models.properties.RefProperty;
23+
1024
import org.apache.commons.lang.StringUtils;
1125
import org.slf4j.Logger;
1226
import org.slf4j.LoggerFactory;
1327

1428
import java.io.File;
15-
import java.util.*;
29+
import java.util.ArrayList;
30+
import java.util.Arrays;
31+
import java.util.HashMap;
32+
import java.util.HashSet;
33+
import java.util.Iterator;
34+
import java.util.List;
35+
import java.util.Map;
1636

1737
public class JavascriptClientCodegen extends DefaultCodegen implements CodegenConfig {
1838
@SuppressWarnings("hiding")
@@ -23,6 +43,7 @@ public class JavascriptClientCodegen extends DefaultCodegen implements CodegenCo
2343
private static final String PROJECT_DESCRIPTION = "projectDescription";
2444
private static final String PROJECT_VERSION = "projectVersion";
2545
private static final String PROJECT_LICENSE_NAME = "projectLicenseName";
46+
private static final String USE_PROMISES = "usePromises";
2647

2748
protected String projectName;
2849
protected String moduleName;
@@ -31,7 +52,8 @@ public class JavascriptClientCodegen extends DefaultCodegen implements CodegenCo
3152

3253
protected String sourceFolder = "src";
3354
protected String localVariablePrefix = "";
34-
55+
protected boolean usePromises = false;
56+
3557
public JavascriptClientCodegen() {
3658
super();
3759
outputFolder = "generated-code/js";
@@ -40,7 +62,7 @@ public JavascriptClientCodegen() {
4062
templateDir = "Javascript";
4163
apiPackage = "api";
4264
modelPackage = "model";
43-
65+
4466
// reference: http://www.w3schools.com/js/js_reserved.asp
4567
reservedWords = new HashSet<String>(
4668
Arrays.asList(
@@ -80,6 +102,9 @@ public JavascriptClientCodegen() {
80102
"version of the project (Default: using info.version or \"1.0.0\")"));
81103
cliOptions.add(new CliOption(PROJECT_LICENSE_NAME,
82104
"name of the license the project uses (Default: using info.license.name)"));
105+
cliOptions.add(new CliOption(USE_PROMISES,
106+
"use Promises as return values from the client API, instead of superagent callbacks")
107+
.defaultValue(Boolean.FALSE.toString()));
83108
}
84109

85110
@Override
@@ -146,7 +171,10 @@ public void preprocessSwagger(Swagger swagger) {
146171
if (additionalProperties.containsKey(CodegenConstants.SOURCE_FOLDER)) {
147172
sourceFolder = (String) additionalProperties.get(CodegenConstants.SOURCE_FOLDER);
148173
}
149-
174+
if (additionalProperties.containsKey(USE_PROMISES)) {
175+
usePromises = Boolean.parseBoolean((String)additionalProperties.get(USE_PROMISES));
176+
}
177+
150178
if (swagger.getInfo() != null) {
151179
Info info = swagger.getInfo();
152180
if (StringUtils.isBlank(projectName) && info.getTitle() != null) {
@@ -189,6 +217,7 @@ public void preprocessSwagger(Swagger swagger) {
189217
additionalProperties.put(PROJECT_VERSION, projectVersion);
190218
additionalProperties.put(CodegenConstants.LOCAL_VARIABLE_PREFIX, localVariablePrefix);
191219
additionalProperties.put(CodegenConstants.SOURCE_FOLDER, sourceFolder);
220+
additionalProperties.put(USE_PROMISES, usePromises);
192221

193222
supportingFiles.add(new SupportingFile("package.mustache", "", "package.json"));
194223
supportingFiles.add(new SupportingFile("index.mustache", sourceFolder, "index.js"));

modules/swagger-codegen/src/main/resources/Javascript/ApiClient.mustache

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -173,7 +173,7 @@
173173

174174
ApiClient.prototype.callApi = function callApi(path, httpMethod, pathParams,
175175
queryParams, headerParams, formParams, bodyParam, contentTypes, accepts,
176-
returnType, callback) {
176+
returnType{{^usePromises}}, callback{{/usePromises}}) {
177177
var _this = this;
178178
var url = this.buildUrl(path, pathParams);
179179
var request = superagent(httpMethod, url);
@@ -214,6 +214,20 @@
214214
request.accept(accept);
215215
}
216216

217+
{{#usePromises}}
218+
return new Promise( function(resolve,reject) {
219+
request.end(function(error, response) {
220+
if (error) {
221+
reject(error);
222+
}
223+
else {
224+
var data = _this.deserialize(response, returnType);
225+
resolve(data);
226+
}
227+
});
228+
});
229+
{{/usePromises}}
230+
{{^usePromises}}
217231
request.end(function(error, response) {
218232
if (callback) {
219233
var data = null;
@@ -225,6 +239,7 @@
225239
});
226240

227241
return request;
242+
{{/usePromises}}
228243
};
229244

230245
ApiClient.parseDate = function parseDate(str) {

modules/swagger-codegen/src/main/resources/Javascript/api.mustache

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,10 @@
2525
* {{summary}}
2626
* {{notes}}
2727
{{#allParams}} * @param {{=<% %>=}}{<% dataType %>} <%={{ }}=%> {{paramName}} {{description}}
28-
{{/allParams}} * @param {function} callback the callback function, accepting three arguments: error, data, response{{#returnType}}
28+
{{/allParams}} {{^usePromises}}* @param {function} callback the callback function, accepting three arguments: error, data, response{{/usePromises}}{{#returnType}}
2929
* data is of type: {{{returnType}}}{{/returnType}}
3030
*/
31-
self.{{nickname}} = function({{#allParams}}{{paramName}}{{#hasMore}}, {{/hasMore}}{{/allParams}}{{#hasParams}}, {{/hasParams}}callback) {
31+
self.{{nickname}} = function({{#allParams}}{{paramName}}{{#hasMore}}, {{/hasMore}}{{/allParams}}{{^usePromises}}{{#hasParams}}, {{/hasParams}}callback{{/usePromises}}) {
3232
var postBody = {{#bodyParam}}{{paramName}}{{/bodyParam}}{{^bodyParam}}null{{/bodyParam}};
3333
{{#allParams}}{{#required}}
3434
// verify the required parameter '{{paramName}}' is set
@@ -58,7 +58,7 @@
5858
return this.apiClient.callApi(
5959
'<&path>', '<httpMethod>',
6060
pathParams, queryParams, headerParams, formParams, postBody,
61-
contentTypes, accepts, returnType, callback
61+
contentTypes, accepts, returnType<^usePromises>, callback</usePromises>
6262
);
6363
<={{ }}=>
6464
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
/node_modules/
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
{
2+
"name": "swagger-petstore",
3+
"version": "1.0.0",
4+
"description": "This is a sample server Petstore server. You can find out more about Swagger at <a href=\"http://swagger.io\">http://swagger.io</a> or on irc.freenode.net, #swagger. For this sample, you can use the api key \"special-key\" to test the authorization filters",
5+
"license": "Apache 2.0",
6+
"main": "src/index.js",
7+
"scripts": {
8+
"test": "./node_modules/mocha/bin/mocha --recursive"
9+
},
10+
"dependencies": {
11+
"superagent": "1.7.1"
12+
},
13+
"devDependencies": {
14+
"mocha": "~2.3.4",
15+
"expect.js": "~0.3.1"
16+
}
17+
}
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
<project>
2+
<modelVersion>4.0.0</modelVersion>
3+
<groupId>io.swagger</groupId>
4+
<artifactId>swagger-petstore-javascript-promise</artifactId>
5+
<packaging>pom</packaging>
6+
<version>1.0-SNAPSHOT</version>
7+
<name>Swagger Petstore - Javascript Client (Promise version)</name>
8+
<build>
9+
<plugins>
10+
<plugin>
11+
<groupId>org.codehaus.mojo</groupId>
12+
<artifactId>exec-maven-plugin</artifactId>
13+
<version>1.2.1</version>
14+
<executions>
15+
<execution>
16+
<id>npm-install</id>
17+
<phase>pre-integration-test</phase>
18+
<goals>
19+
<goal>exec</goal>
20+
</goals>
21+
<configuration>
22+
<executable>npm</executable>
23+
<arguments>
24+
<argument>install</argument>
25+
</arguments>
26+
</configuration>
27+
</execution>
28+
<execution>
29+
<id>mocha</id>
30+
<phase>integration-test</phase>
31+
<goals>
32+
<goal>exec</goal>
33+
</goals>
34+
<configuration>
35+
<executable>npm</executable>
36+
<arguments>
37+
<argument>test</argument>
38+
</arguments>
39+
</configuration>
40+
</execution>
41+
</executions>
42+
</plugin>
43+
</plugins>
44+
</build>
45+
</project>

0 commit comments

Comments
 (0)