Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
36 commits
Select commit Hold shift + click to select a range
b950271
Add a Javascript (Closure) Angular generator.
achew22 Jan 28, 2016
8ea7cbc
Add bash script to run
achew22 Jan 28, 2016
af6926b
Add sample output from Javascript Closure Angular
achew22 Jan 28, 2016
b1a5080
Add default includes for Array and Object.
achew22 Jan 28, 2016
b9eb26b
Change indentation to +4 and map binary to string
achew22 Jan 29, 2016
42f6690
Add tests for API
achew22 Feb 2, 2016
eb9cff7
added x-swagger-router-controller, operationId for node.js versions
fehguy Feb 6, 2016
c80df9e
Merge pull request #2052 from swagger-api/issue-2001
fehguy Feb 6, 2016
897c854
Use prototypes for model methods
delenius Feb 6, 2016
a4d7a97
added json provider for https://github.com/swagger-api/swagger-core/r…
fehguy Feb 6, 2016
eafd79e
updated index file
fehguy Feb 6, 2016
3174ab0
Merge pull request #1997 from achew22/javascript_closure
wing328 Feb 7, 2016
510a5bd
Merge pull request #2055 from delenius/prototype-fixed
wing328 Feb 7, 2016
9f78b3c
fix local java test using fully qualified name
wing328 Feb 7, 2016
a9ab8a6
Merge pull request #2057 from wing328/fix_local_java_test
wing328 Feb 7, 2016
ab39eff
Add additionalProperties handling in python code genrator by adding d…
Feb 7, 2016
ec4c550
fix identation
Feb 7, 2016
32d2a4d
fix python 3.4 compatabilty
Feb 7, 2016
a968d90
Merge pull request #2058 from mtngld/master
wing328 Feb 7, 2016
5ac630f
Fix for issue #2036, python client wont upload list of files
scottrw93 Feb 4, 2016
833ce25
Change post_param from dict to list of tuples to allow list of files
scottrw93 Feb 5, 2016
2407c49
Change post_param from dict to list of tuples to allow list of files
scottrw93 Feb 5, 2016
b43e1e2
Change form_param to list of tuples from dict
scottrw93 Feb 5, 2016
57f38e4
Update pet-store python client files
scottrw93 Feb 5, 2016
a6fe87a
Use more appropriate variable name
scottrw93 Feb 7, 2016
59fde5f
Merge pull request #2060 from wing328/scottrw93_fix_2036
wing328 Feb 7, 2016
2ddbfa8
Now it should be fully compatible with python 2.7 and 3.4
Feb 7, 2016
341f862
change the order of the elif inside to_dict for better performance (d…
Feb 7, 2016
2a73c11
Merge pull request #2063 from mtngld/issue_2037
wing328 Feb 8, 2016
12ff5cc
updated to 1.0.18-SNAPSHOT for https://github.com/swagger-api/swagger…
fehguy Feb 8, 2016
153faeb
Modify JS PetStore tests for prototypes change
delenius Feb 8, 2016
802f9e4
revert to `Object` when model missing
fehguy Feb 8, 2016
e2d61ab
update parser version
fehguy Feb 8, 2016
e99e322
adde Date mapping, escape operationId
fehguy Feb 8, 2016
f539fdc
Merge pull request #2074 from swagger-api/issue-2073
fehguy Feb 8, 2016
cabe003
Merge pull request #2071 from delenius/prototype-tests
wing328 Feb 9, 2016
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 31 additions & 0 deletions bin/javascript-closure-angular.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
#!/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

executable="./modules/swagger-codegen-cli/target/swagger-codegen-cli.jar"

if [ ! -f "$executable" ]
then
mvn clean package
fi

# if you've executed sbt assembly previously it will use that instead.
export JAVA_OPTS="${JAVA_OPTS} -XX:MaxPermSize=256M -Xmx1024M -DloggerPath=conf/log4j.properties"
ags="$@ generate -i modules/swagger-codegen/src/test/resources/2_0/petstore.json -l javascript-closure-angular -o samples/client/petstore/javascript-closure-angular"

java $JAVA_OPTS -jar $executable $ags
Original file line number Diff line number Diff line change
Expand Up @@ -1411,6 +1411,8 @@ public CodegenOperation fromOperation(String path, String httpMethod, Operation
} else if (param instanceof FormParameter) {
if ("file".equalsIgnoreCase(((FormParameter) param).getType())) {
p.isFile = true;
} else if("file".equals(p.baseType)){
p.isFile = true;
} else {
p.notFile = true;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -218,7 +218,12 @@ public void flattenProperties(Map<String, Property> properties, String path) {
Map<String, Model> modelsToAdd = new HashMap<String, Model>();
for (String key : properties.keySet()) {
Property property = properties.get(key);
if (property instanceof ObjectProperty && ((ObjectProperty)property).getProperties().size() > 0) {
if(property instanceof ObjectProperty && ((ObjectProperty)property).getProperties() == null) {
MapProperty mp = new MapProperty();
mp.setAdditionalProperties(new StringProperty());
properties.put(key, mp);
}
else if (property instanceof ObjectProperty && ((ObjectProperty)property).getProperties().size() > 0) {
String modelName = uniqueName(path + "_" + key);

ObjectProperty op = (ObjectProperty) property;
Expand Down Expand Up @@ -276,7 +281,6 @@ public void flattenProperties(Map<String, Property> properties, String path) {
swagger.addDefinition(modelName, innerModel);
}
}
} else {
}
}
if (propsToUpdate.size() > 0) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,35 +1,19 @@
package io.swagger.codegen.languages;

import com.google.common.base.Strings;

import io.swagger.codegen.CliOption;
import io.swagger.codegen.CodegenConfig;
import io.swagger.codegen.CodegenConstants;
import io.swagger.codegen.CodegenModel;
import io.swagger.codegen.CodegenOperation;
import io.swagger.codegen.CodegenProperty;
import io.swagger.codegen.CodegenType;
import io.swagger.codegen.DefaultCodegen;
import io.swagger.codegen.SupportingFile;
import io.swagger.codegen.*;
import io.swagger.models.*;
import io.swagger.models.properties.ArrayProperty;
import io.swagger.models.properties.MapProperty;
import io.swagger.models.properties.Property;
import io.swagger.models.properties.RefProperty;

import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.File;
import java.util.*;

public class JavascriptClientCodegen extends DefaultCodegen implements CodegenConfig {
@SuppressWarnings("hiding")
private static final Logger LOGGER = LoggerFactory.getLogger(JavascriptClientCodegen.class);
Expand Down Expand Up @@ -133,6 +117,7 @@ public void processOpts() {
typeMapping.put("double", "Number");
typeMapping.put("number", "Number");
typeMapping.put("DateTime", "Date");
typeMapping.put("Date", "Date");
// binary not supported in JavaScript client right now, using String as a workaround
typeMapping.put("binary", "String");

Expand Down Expand Up @@ -358,7 +343,7 @@ public String toOperationId(String operationId) {

// method name cannot use reserved keyword, e.g. return
if (reservedWords.contains(operationId)) {
throw new RuntimeException(operationId + " (reserved word) cannot be used as method name");
operationId = escapeReservedWord(operationId);
}

return camelize(sanitizeName(operationId), true);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,216 @@
package io.swagger.codegen.languages;

import io.swagger.codegen.CodegenModel;
import io.swagger.codegen.*;
import io.swagger.models.properties.*;

import java.util.TreeSet;
import java.util.*;
import java.io.File;

public class JavascriptClosureAngularClientCodegen extends DefaultCodegen implements CodegenConfig {
public JavascriptClosureAngularClientCodegen() {
super();

supportsInheritance = false;
reservedWords = new HashSet<String>(Arrays.asList("abstract",
"continue", "for", "new", "switch", "assert", "default", "if",
"package", "synchronized", "do", "goto", "private",
"this", "break", "double", "implements", "protected", "throw",
"byte", "else", "import", "public", "throws", "case", "enum",
"instanceof", "return", "transient", "catch", "extends", "int",
"short", "try", "char", "final", "interface", "static", "void",
"class", "finally", "const", "super", "while"));

languageSpecificPrimitives = new HashSet<String>(Arrays.asList(
"string",
"boolean",
"number",
"Object",
"Blob",
"Date"));
instantiationTypes.put("array", "Array");

typeMapping = new HashMap<String, String>();
typeMapping.put("Array", "Array");
typeMapping.put("array", "Array");
typeMapping.put("List", "Array");
typeMapping.put("boolean", "boolean");
typeMapping.put("string", "string");
typeMapping.put("int", "number");
typeMapping.put("float", "number");
typeMapping.put("number", "number");
typeMapping.put("long", "number");
typeMapping.put("short", "number");
typeMapping.put("char", "string");
typeMapping.put("double", "number");
typeMapping.put("object", "Object");
typeMapping.put("Object", "Object");
typeMapping.put("File", "Blob");
typeMapping.put("file", "Blob");
typeMapping.put("integer", "number");
typeMapping.put("Map", "Object");
typeMapping.put("map", "Object");
typeMapping.put("DateTime", "Date");

importMapping = new HashMap<String, String>();
defaultIncludes = new HashSet<String>(Arrays.asList(
"Object",
"Array",
"Blob"
));

typeMapping.put("binary", "string");

outputFolder = "generated-code/javascript-closure-angular";
modelTemplateFiles.put("model.mustache", ".js");
apiTemplateFiles.put("api.mustache", ".js");
embeddedTemplateDir = templateDir = "Javascript-Closure-Angular";
apiPackage = "API.Client";
modelPackage = "API.Client";
}

@Override
public String getName() {
return "javascript-closure-angular";
}

@Override
public String getHelp() {
return "Generates a Javascript AngularJS client library annotated with Google Closure Compiler annotations" +
"(https://developers.google.com/closure/compiler/docs/js-for-compiler?hl=en)";
}

@Override
public CodegenType getTag() {
return CodegenType.CLIENT;
}

@Override
public String escapeReservedWord(String name) {
return "_" + name;
}

@Override
public String apiFileFolder() {
return outputFolder + "/" + apiPackage().replace('.', File.separatorChar);
}

public String modelFileFolder() {
return outputFolder + "/" + modelPackage().replace('.', File.separatorChar);
}

@Override
public String toVarName(String name) {
// replace - with _ e.g. created-at => created_at
name = name.replaceAll("-", "_");

// if it's all uppper case, do nothing
if (name.matches("^[A-Z_]*$"))
return name;

// camelize the variable name
// pet_id => PetId
name = camelize(name, true);

// for reserved word or word starting with number, append _
if (reservedWords.contains(name) || name.matches("^\\d.*"))
name = escapeReservedWord(name);

return name;
}

@Override
public String toParamName(String name) {
// should be the same as variable name
return toVarName(name);
}

@Override
public String toModelName(String name) {
// model name cannot use reserved keyword, e.g. return
if (reservedWords.contains(name))
throw new RuntimeException(name
+ " (reserved word) cannot be used as a model name");

// camelize the model name
// phone_number => PhoneNumber
return camelize(name);
}

@Override
public String toModelFilename(String name) {
// should be the same as the model name
return toModelName(name);
}

@Override
public String getTypeDeclaration(Property p) {
if (p instanceof ArrayProperty) {
ArrayProperty ap = (ArrayProperty) p;
Property inner = ap.getItems();
return getSwaggerType(p) + "<!" + getTypeDeclaration(inner) + ">";
} else if (p instanceof MapProperty) {
MapProperty mp = (MapProperty) p;
Property inner = mp.getAdditionalProperties();
return "Object<!string, "+ getTypeDeclaration(inner) + ">";
} else if (p instanceof FileProperty) {
return "Object";
}
String type = super.getTypeDeclaration(p);
if (type.equals("boolean") ||
type.equals("Date") ||
type.equals("number") ||
type.equals("string")) {
return type;
}
return apiPackage + "." + type;
}

@Override
public String getSwaggerType(Property p) {
String swaggerType = super.getSwaggerType(p);
String type = null;
if (typeMapping.containsKey(swaggerType)) {
type = typeMapping.get(swaggerType);
if (languageSpecificPrimitives.contains(type)) {
return type;
}
} else
type = swaggerType;
return type;
}

@Override
public Map<String, Object> postProcessModels(Map<String, Object> objs) {

List<Object> models = (List<Object>) objs.get("models");
for (Object _mo : models) {
Map<String, Object> mo = (Map<String, Object>) _mo;
CodegenModel cm = (CodegenModel) mo.get("model");
cm.imports = new TreeSet(cm.imports);
for (CodegenProperty var : cm.vars) {
// handle default value for enum, e.g. available => StatusEnum.available
if (var.isEnum && var.defaultValue != null && !"null".equals(var.defaultValue)) {
var.defaultValue = var.datatypeWithEnum + "." + var.defaultValue;
}
}
}
return objs;
}

@Override
public Map<String, Object> postProcessOperations(Map<String, Object> objs) {
if (objs.get("imports") instanceof List) {
List<Map<String, String>> imports = (ArrayList<Map<String, String>>)objs.get("imports");
Collections.sort(imports, new Comparator<Map<String, String>>() {
public int compare(Map<String, String> o1, Map<String, String> o2) {
return o1.get("import").compareTo(o2.get("import"));
}
});
objs.put("imports", imports);
}
return objs;
}

}
Loading