Skip to content

Commit b0d39f9

Browse files
authored
Merge branch 'master' into fix-local-variable-body
2 parents 352625e + 6a6cda4 commit b0d39f9

28 files changed

+1062
-53
lines changed

src/main/java/io/swagger/codegen/v3/generators/DefaultCodegenConfig.java

Lines changed: 31 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -358,12 +358,18 @@ public void processModelEnums(Map<String, Object> objs) {
358358
}
359359
cm.allowableValues.put("enumVars", enumVars);
360360
}
361+
updateCodegenModelEnumVars(cm);
362+
}
363+
}
361364

362-
// update codegen property enum with proper naming convention
363-
// and handling of numbers, special characters
364-
for (CodegenProperty var : cm.vars) {
365-
updateCodegenPropertyEnum(var);
366-
}
365+
/**
366+
* update codegen property enum with proper naming convention
367+
* and handling of numbers, special characters
368+
* @param codegenModel
369+
*/
370+
protected void updateCodegenModelEnumVars(CodegenModel codegenModel) {
371+
for (CodegenProperty var : codegenModel.vars) {
372+
updateCodegenPropertyEnum(var);
367373
}
368374
}
369375

@@ -2290,7 +2296,26 @@ public CodegenResponse fromResponse(String responseCode, ApiResponse response) {
22902296
final Schema responseSchema = getSchemaFromResponse(response);
22912297
codegenResponse.schema = responseSchema;
22922298
codegenResponse.message = escapeText(response.getDescription());
2293-
// TODO: codegenResponse.examples = toExamples(response.getExamples());
2299+
2300+
if (response.getContent()!= null) {
2301+
Map<String, Object> examples = new HashMap<>();
2302+
for (String name : response.getContent().keySet()) {
2303+
if (response.getContent().get(name) != null) {
2304+
2305+
if (response.getContent().get(name).getExample() != null) {
2306+
examples.put(name, response.getContent().get(name).getExample());
2307+
}
2308+
if (response.getContent().get(name).getExamples() != null) {
2309+
2310+
for (String exampleName : response.getContent().get(name).getExamples().keySet()) {
2311+
examples.put(exampleName, response.getContent().get(name).getExamples().get(exampleName).getValue());
2312+
}
2313+
}
2314+
}
2315+
}
2316+
codegenResponse.examples = toExamples(examples);
2317+
}
2318+
22942319
codegenResponse.jsonSchema = Json.pretty(response);
22952320
if (response.getExtensions() != null && !response.getExtensions().isEmpty()) {
22962321
codegenResponse.vendorExtensions.putAll(response.getExtensions());

src/main/java/io/swagger/codegen/v3/generators/kotlin/AbstractKotlinCodegen.java

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,15 @@ public AbstractKotlinCodegen() {
5353
"kotlin.Array",
5454
"kotlin.collections.List",
5555
"kotlin.collections.Map",
56-
"kotlin.collections.Set"
56+
"kotlin.collections.Set",
57+
"kotlin.ByteArray",
58+
"kotlin.CharArray",
59+
"kotlin.ShortArray",
60+
"kotlin.IntArray",
61+
"kotlin.LongArray",
62+
"kotlin.FloatArray",
63+
"kotlin.DoubleArray",
64+
"kotlin.BooleanArray"
5765
));
5866

5967
// this includes hard reserved words defined by https://github.com/JetBrains/kotlin/blob/master/core/descriptors/src/org/jetbrains/kotlin/renderer/KeywordStringsGenerated.java
@@ -138,7 +146,15 @@ public AbstractKotlinCodegen() {
138146
"kotlin.Array",
139147
"kotlin.collections.List",
140148
"kotlin.collections.Set",
141-
"kotlin.collections.Map"
149+
"kotlin.collections.Map",
150+
"kotlin.ByteArray",
151+
"kotlin.CharArray",
152+
"kotlin.ShortArray",
153+
"kotlin.IntArray",
154+
"kotlin.LongArray",
155+
"kotlin.FloatArray",
156+
"kotlin.DoubleArray",
157+
"kotlin.BooleanArray"
142158
));
143159

144160
instantiationLibraryFunction = new HashSet<>(Arrays.asList(

src/main/java/io/swagger/codegen/v3/generators/swift/Swift5Codegen.java

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -196,11 +196,14 @@ public Swift5Codegen() {
196196
typeMapping.put("float", "Float");
197197
typeMapping.put("number", "Double");
198198
typeMapping.put("double", "Double");
199-
typeMapping.put("object", "JSONValue");
199+
typeMapping.put("object", "Any");
200+
typeMapping.put("Object", "Any");
200201
typeMapping.put("file", "URL");
201202
typeMapping.put("binary", "Data");
202203
typeMapping.put("ByteArray", "Data");
203204
typeMapping.put("UUID", "UUID");
205+
typeMapping.put("URI", "String");
206+
typeMapping.put("BigDecimal", "Decimal");
204207

205208
importMapping = new HashMap<>();
206209

@@ -346,6 +349,8 @@ public void processOpts() {
346349
"",
347350
".gitignore"));
348351

352+
copyFistAllOfProperties = true;
353+
349354
}
350355

351356
@Override
@@ -597,6 +602,13 @@ public CodegenModel fromModel(String name, Schema model, Map<String, Schema> all
597602
return codegenModel;
598603
}
599604

605+
protected void updateCodegenModelEnumVars(CodegenModel codegenModel) {
606+
super.updateCodegenModelEnumVars(codegenModel);
607+
for (CodegenProperty var : codegenModel.allVars) {
608+
updateCodegenPropertyEnum(var);
609+
}
610+
}
611+
600612
@Override
601613
public CodegenOperation fromOperation(String path, String httpMethod, Operation operation, Map<String, Schema> definitions, OpenAPI openAPI) {
602614
CodegenOperation codegenOperation = super.fromOperation(path, httpMethod, operation, definitions, openAPI);
Lines changed: 217 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,217 @@
1+
package io.swagger.codegen.v3.generators.typescript;
2+
3+
import io.swagger.codegen.v3.CodegenConstants;
4+
import io.swagger.codegen.v3.CodegenModel;
5+
import io.swagger.codegen.v3.CodegenOperation;
6+
import io.swagger.codegen.v3.CodegenProperty;
7+
import io.swagger.codegen.v3.SupportingFile;
8+
import org.apache.commons.lang3.StringUtils;
9+
10+
import java.util.ArrayList;
11+
import java.util.HashMap;
12+
import java.util.List;
13+
import java.util.Locale;
14+
import java.util.Map;
15+
import java.util.TreeSet;
16+
17+
import static io.swagger.codegen.v3.generators.handlebars.ExtensionHelper.getBooleanValue;
18+
19+
public class TypeScriptAxiosClientCodegen extends AbstractTypeScriptClientCodegen {
20+
21+
public static final String NPM_NAME = "npmName";
22+
public static final String NPM_REPOSITORY = "npmRepository";
23+
public static final String DEFAULT_API_PACKAGE = "apis";
24+
public static final String DEFAULT_MODEL_PACKAGE = "models";
25+
26+
protected String npmRepository = null;
27+
28+
private String tsModelPackage = "";
29+
30+
public TypeScriptAxiosClientCodegen() {
31+
super();
32+
importMapping.clear();
33+
outputFolder = "generated-code/typescript-axios";
34+
}
35+
36+
@Override
37+
public String getName() {
38+
return "typescript-axios";
39+
}
40+
41+
@Override
42+
public String getHelp() {
43+
return "Generates a TypeScript Axios client library.";
44+
}
45+
46+
public String getNpmRepository() {
47+
return npmRepository;
48+
}
49+
50+
public void setNpmRepository(String npmRepository) {
51+
this.npmRepository = npmRepository;
52+
}
53+
54+
private static String getRelativeToRoot(String path) {
55+
StringBuilder sb = new StringBuilder();
56+
int slashCount = path.split("/").length;
57+
if (slashCount == 0) {
58+
sb.append("./");
59+
} else {
60+
for (int i = 0; i < slashCount; ++i) {
61+
sb.append("../");
62+
}
63+
}
64+
return sb.toString();
65+
}
66+
67+
@Override
68+
public void processOpts() {
69+
super.processOpts();
70+
if (StringUtils.isBlank(modelPackage)) {
71+
modelPackage = DEFAULT_MODEL_PACKAGE;
72+
}
73+
if (StringUtils.isBlank(apiPackage)) {
74+
apiPackage = DEFAULT_API_PACKAGE;
75+
}
76+
tsModelPackage = modelPackage.replaceAll("\\.", "/");
77+
String tsApiPackage = apiPackage.replaceAll("\\.", "/");
78+
79+
String modelRelativeToRoot = getRelativeToRoot(tsModelPackage);
80+
String apiRelativeToRoot = getRelativeToRoot(tsApiPackage);
81+
82+
additionalProperties.put("tsModelPackage", tsModelPackage);
83+
additionalProperties.put("tsApiPackage", tsApiPackage);
84+
additionalProperties.put("apiRelativeToRoot", apiRelativeToRoot);
85+
additionalProperties.put("modelRelativeToRoot", modelRelativeToRoot);
86+
87+
supportingFiles.add(new SupportingFile("index.mustache", "", "index.ts"));
88+
supportingFiles.add(new SupportingFile("baseApi.mustache", "", "base.ts"));
89+
supportingFiles.add(new SupportingFile("api.mustache", "", "api.ts"));
90+
supportingFiles.add(new SupportingFile("configuration.mustache", "", "configuration.ts"));
91+
supportingFiles.add(new SupportingFile("git_push.sh.mustache", "", "git_push.sh"));
92+
supportingFiles.add(new SupportingFile("gitignore", "", ".gitignore"));
93+
supportingFiles.add(new SupportingFile("npmignore", "", ".npmignore"));
94+
95+
modelTemplateFiles.put("model.mustache", ".ts");
96+
apiTemplateFiles.put("apiInner.mustache", ".ts");
97+
supportingFiles.add(new SupportingFile("modelIndex.mustache", tsModelPackage, "index.ts"));
98+
99+
supportingFiles.add(new SupportingFile("README.mustache", "", "README.md"));
100+
supportingFiles.add(new SupportingFile("package.mustache", "", "package.json"));
101+
supportingFiles.add(new SupportingFile("tsconfig.mustache", "", "tsconfig.json"));
102+
}
103+
104+
@Override
105+
public Map<String, Object> postProcessOperations(Map<String, Object> operations) {
106+
boolean hasImports = operations.get("hasImport") != null && Boolean.parseBoolean(operations.get("hasImport").toString());
107+
if (hasImports) {
108+
List<Map<String, String>> imports = (List<Map<String, String>>) operations.get("imports");
109+
110+
for (Map<String, String> importMap : imports) {
111+
final String importValue = importMap.get("import");
112+
if (StringUtils.isNotBlank(importValue) && importValue.contains(".")) {
113+
int index = importValue.indexOf(".");
114+
importMap.put("import", importValue.substring(index + 1));
115+
}
116+
}
117+
}
118+
return operations;
119+
}
120+
121+
@Override
122+
public Map<String, Object> postProcessOperationsWithModels(Map<String, Object> objs, List<Object> allModels) {
123+
objs = super.postProcessOperationsWithModels(objs, allModels);
124+
Map<String, Object> vals = (Map<String, Object>) objs.getOrDefault("operations", new HashMap<>());
125+
List<CodegenOperation> operations = (List<CodegenOperation>) vals.getOrDefault("operation", new ArrayList<>());
126+
/*
127+
Filter all the operations that are multipart/form-data operations and set the vendor extension flag
128+
'multipartFormData' for the template to work with.
129+
*/
130+
operations.stream()
131+
.filter(op -> getBooleanValue(op, CodegenConstants.HAS_CONSUMES_EXT_NAME))
132+
.filter(op -> op.consumes.stream().anyMatch(opc -> opc.values().stream().anyMatch("multipart/form-data"::equals)))
133+
.forEach(op -> op.vendorExtensions.putIfAbsent("multipartFormData", true));
134+
return objs;
135+
}
136+
137+
@Override
138+
public Map<String, Object> postProcessAllModels(Map<String, Object> objs) {
139+
Map<String, Object> result = super.postProcessAllModels(objs);
140+
for (Map.Entry<String, Object> entry : result.entrySet()) {
141+
Map<String, Object> inner = (Map<String, Object>) entry.getValue();
142+
List<Map<String, Object>> models = (List<Map<String, Object>>) inner.get("models");
143+
for (Map<String, Object> model : models) {
144+
CodegenModel codegenModel = (CodegenModel) model.get("model");
145+
//todo: model.put("hasAllOf", codegenModel.allOf.size() > 0);
146+
//todo: model.put("hasOneOf", codegenModel.oneOf.size() > 0);
147+
}
148+
}
149+
return result;
150+
}
151+
152+
153+
@Override
154+
public Map<String, Object> postProcessModels(Map<String, Object> objs) {
155+
List<Object> models = (List<Object>) postProcessModelsEnum(objs).get("models");
156+
157+
for (Object _mo : models) {
158+
Map<String, Object> mo = (Map<String, Object>) _mo;
159+
CodegenModel cm = (CodegenModel) mo.get("model");
160+
161+
// Deduce the model file name in kebab case
162+
cm.classFilename = cm.classname.replaceAll("([a-z0-9])([A-Z])", "$1-$2").toLowerCase(Locale.ROOT);
163+
164+
//processed enum names
165+
cm.imports = new TreeSet(cm.imports);
166+
// name enum with model name, e.g. StatusEnum => PetStatusEnum
167+
for (CodegenProperty var : cm.vars) {
168+
if (getBooleanValue(var, CodegenConstants.IS_ENUM_EXT_NAME)) {
169+
var.datatypeWithEnum = var.datatypeWithEnum.replace(var.enumName, cm.classname + var.enumName);
170+
var.enumName = var.enumName.replace(var.enumName, cm.classname + var.enumName);
171+
}
172+
}
173+
if (cm.parent != null) {
174+
for (CodegenProperty var : cm.allVars) {
175+
if (getBooleanValue(var, CodegenConstants.IS_ENUM_EXT_NAME)) {
176+
var.datatypeWithEnum = var.datatypeWithEnum.replace(var.enumName, cm.classname + var.enumName);
177+
var.enumName = var.enumName.replace(var.enumName, cm.classname + var.enumName);
178+
}
179+
}
180+
}
181+
}
182+
183+
// Apply the model file name to the imports as well
184+
for (Map<String, String> m : (List<Map<String, String>>) objs.get("imports")) {
185+
String javaImport = m.get("import").substring(modelPackage.length() + 1);
186+
String tsImport = tsModelPackage + "/" + javaImport;
187+
m.put("tsImport", tsImport);
188+
m.put("class", javaImport);
189+
m.put("filename", javaImport.replaceAll("([a-z0-9])([A-Z])", "$1-$2").toLowerCase(Locale.ROOT));
190+
}
191+
return objs;
192+
}
193+
194+
/**
195+
* Overriding toRegularExpression() to avoid escapeText() being called,
196+
* as it would return a broken regular expression if any escaped character / metacharacter were present.
197+
*/
198+
@Override
199+
public String toRegularExpression(String pattern) {
200+
return addRegularExpressionDelimiter(pattern);
201+
}
202+
203+
@Override
204+
public String toModelFilename(String name) {
205+
return super.toModelFilename(name).replaceAll("([a-z0-9])([A-Z])", "$1-$2").toLowerCase(Locale.ROOT);
206+
}
207+
208+
@Override
209+
public String toApiFilename(String name) {
210+
return super.toApiFilename(name).replaceAll("([a-z0-9])([A-Z])", "$1-$2").toLowerCase(Locale.ROOT);
211+
}
212+
213+
@Override
214+
public String getDefaultTemplateDir() {
215+
return "typescript-axios";
216+
}
217+
}

src/main/resources/META-INF/services/io.swagger.codegen.v3.CodegenConfig

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,5 +34,6 @@ io.swagger.codegen.v3.generators.swift.Swift3Codegen
3434
io.swagger.codegen.v3.generators.swift.Swift4Codegen
3535
io.swagger.codegen.v3.generators.swift.Swift5Codegen
3636
io.swagger.codegen.v3.generators.typescript.TypeScriptAngularClientCodegen
37+
io.swagger.codegen.v3.generators.typescript.TypeScriptAxiosClientCodegen
3738
io.swagger.codegen.v3.generators.typescript.TypeScriptFetchClientCodegen
3839
io.swagger.codegen.v3.generators.javascript.JavaScriptClientCodegen
8 KB
Binary file not shown.
Lines changed: 17 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,22 @@
1-
Microsoft Visual Studio Solution File, Format Version 12.00
1+
2+
Microsoft Visual Studio Solution File, Format Version 12.00
23
# Visual Studio 15
3-
VisualStudioVersion = 15.0.26114.2
4+
VisualStudioVersion = 15.0.27428.2043
45
MinimumVisualStudioVersion = 10.0.40219.1
5-
Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "{{packageName}}", "src{{backslash}}{{packageName}}{{backslash}}{{packageName}}.csproj", "{{packageGuid}}"
6+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "{{packageName}}", "{{sourceFolder}}{{backslash}}{{packageName}}{{backslash}}{{packageName}}.csproj", "{{packageGuid}}"
67
EndProject
78
Global
8-
GlobalSection(SolutionConfigurationPlatforms) = preSolution
9-
Debug|Any CPU = Debug|Any CPU
10-
Release|Any CPU = Release|Any CPU
11-
EndGlobalSection
12-
GlobalSection(ProjectConfigurationPlatforms) = postSolution
13-
{{packageGuid}}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
14-
{{packageGuid}}.Debug|Any CPU.Build.0 = Debug|Any CPU
15-
{{packageGuid}}.Release|Any CPU.ActiveCfg = Release|Any CPU
16-
{{packageGuid}}.Release|Any CPU.Build.0 = Release|Any CPU
17-
EndGlobalSection
18-
GlobalSection(SolutionProperties) = preSolution
19-
HideSolutionNode = FALSE
20-
EndGlobalSection
9+
GlobalSection(SolutionConfigurationPlatforms) = preSolution
10+
Debug|Any CPU = Debug|Any CPU
11+
Release|Any CPU = Release|Any CPU
12+
EndGlobalSection
13+
GlobalSection(ProjectConfigurationPlatforms) = postSolution
14+
{{packageGuid}}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
15+
{{packageGuid}}.Debug|Any CPU.Build.0 = Debug|Any CPU
16+
{{packageGuid}}.Release|Any CPU.ActiveCfg = Release|Any CPU
17+
{{packageGuid}}.Release|Any CPU.Build.0 = Release|Any CPU
18+
EndGlobalSection
19+
GlobalSection(SolutionProperties) = preSolution
20+
HideSolutionNode = FALSE
21+
EndGlobalSection
2122
EndGlobal

0 commit comments

Comments
 (0)