Skip to content

Commit 5c00898

Browse files
authored
Merge branch 'master' into master
2 parents 55eb1f5 + d39f4ae commit 5c00898

File tree

14 files changed

+175
-102
lines changed

14 files changed

+175
-102
lines changed

pom.xml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212

1313
<groupId>io.swagger.codegen.v3</groupId>
1414
<artifactId>swagger-codegen-generators</artifactId>
15-
<version>1.0.27-SNAPSHOT</version>
15+
<version>1.0.28-SNAPSHOT</version>
1616
<packaging>jar</packaging>
1717

1818
<build>
@@ -252,9 +252,9 @@
252252
</dependency>
253253
</dependencies>
254254
<properties>
255-
<swagger-codegen-version>3.0.27-SNAPSHOT</swagger-codegen-version>
256-
<swagger-parser-version>2.0.26</swagger-parser-version>
257-
<swagger-core-version>2.1.9</swagger-core-version>
255+
<swagger-codegen-version>3.0.28-SNAPSHOT</swagger-codegen-version>
256+
<swagger-parser-version>2.0.27</swagger-parser-version>
257+
<swagger-core-version>2.1.10</swagger-core-version>
258258
<jackson-version>2.12.1</jackson-version>
259259
<scala-version>2.11.1</scala-version>
260260
<felix-version>3.3.0</felix-version>

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

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1358,12 +1358,7 @@ public CodegenModel fromModel(String name, Schema schema, Map<String, Schema> al
13581358
addParentContainer(codegenModel, name, schema);
13591359
}
13601360
else if (schema instanceof MapSchema) {
1361-
codegenModel.getVendorExtensions().put(CodegenConstants.IS_MAP_CONTAINER_EXT_NAME, Boolean.TRUE);
1362-
codegenModel.getVendorExtensions().put(IS_CONTAINER_EXT_NAME, Boolean.TRUE);
1363-
addParentContainer(codegenModel, name, schema);
1364-
if (hasSchemaProperties(schema) || hasTrueAdditionalProperties(schema)) {
1365-
addAdditionPropertiesToCodeGenModel(codegenModel, schema);
1366-
}
1361+
processMapSchema(codegenModel, name, schema);
13671362

13681363
}
13691364
else if (schema instanceof ComposedSchema) {
@@ -1493,6 +1488,15 @@ else if (schema instanceof ComposedSchema) {
14931488
return codegenModel;
14941489
}
14951490

1491+
protected void processMapSchema(CodegenModel codegenModel, String name, Schema schema) {
1492+
codegenModel.getVendorExtensions().put(CodegenConstants.IS_MAP_CONTAINER_EXT_NAME, Boolean.TRUE);
1493+
codegenModel.getVendorExtensions().put(IS_CONTAINER_EXT_NAME, Boolean.TRUE);
1494+
addParentContainer(codegenModel, name, schema);
1495+
if (hasSchemaProperties(schema) || hasTrueAdditionalProperties(schema)) {
1496+
addAdditionPropertiesToCodeGenModel(codegenModel, schema);
1497+
}
1498+
}
1499+
14961500
/**
14971501
* Recursively look for a discriminator in the interface tree
14981502
*/

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -876,6 +876,11 @@ protected List<Map<String, Object>> modelInheritanceSupport(List<?> allModels) {
876876
Map<String, Object> parent = new HashMap<>();
877877
parent.put("classname", parentModel.classname);
878878
List<CodegenModel> childrenModels = byParent.get(parentModel);
879+
880+
if (childrenModels == null || childrenModels.isEmpty()) {
881+
continue;
882+
}
883+
879884
for (CodegenModel model : childrenModels) {
880885
Map<String, Object> child = new HashMap<>();
881886
child.put("name", model.name);

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111
import io.swagger.v3.oas.models.media.Schema;
1212
import org.slf4j.Logger;
1313
import org.slf4j.LoggerFactory;
14+
import com.github.jknack.handlebars.helper.StringHelpers;
15+
import com.github.jknack.handlebars.Handlebars;
1416

1517
import java.io.File;
1618
import java.util.Arrays;
@@ -506,6 +508,12 @@ public String toVarName(String name) {
506508
return super.toVarName(sanitizeKotlinSpecificNames(name));
507509
}
508510

511+
@Override
512+
public void addHandlebarHelpers(Handlebars handlebars) {
513+
super.addHandlebarHelpers(handlebars);
514+
handlebars.registerHelpers(StringHelpers.class);
515+
}
516+
509517
/**
510518
* Provides a strongly typed declaration for simple arrays of some type and arrays of arrays of some type.
511519
*

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

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,6 @@
1818
import java.util.Arrays;
1919
import java.util.List;
2020
import java.util.Map;
21-
import com.github.jknack.handlebars.helper.StringHelpers;
22-
import com.github.jknack.handlebars.Handlebars;
2321
import org.apache.commons.lang3.StringUtils;
2422

2523
import static java.util.Collections.singletonMap;
@@ -228,12 +226,6 @@ public void processOpts() {
228226
supportingFiles.add(new SupportingFile("ApiKeyAuth.kt.mustache", infrastructureFolder, "ApiKeyAuth.kt"));
229227
}
230228

231-
@Override
232-
public void addHandlebarHelpers(Handlebars handlebars) {
233-
super.addHandlebarHelpers(handlebars);
234-
handlebars.registerHelpers(StringHelpers.class);
235-
}
236-
237229
@Override
238230
public String getDefaultTemplateDir() {
239231
return "kotlin-server";

src/main/java/io/swagger/codegen/v3/generators/php/PhpClientCodegen.java

Lines changed: 24 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,32 +2,40 @@
22

33
import io.swagger.codegen.v3.CliOption;
44
import io.swagger.codegen.v3.CodegenConstants;
5+
import io.swagger.codegen.v3.CodegenModel;
56
import io.swagger.codegen.v3.CodegenOperation;
67
import io.swagger.codegen.v3.CodegenParameter;
78
import io.swagger.codegen.v3.CodegenProperty;
89
import io.swagger.codegen.v3.CodegenSecurity;
910
import io.swagger.codegen.v3.CodegenType;
1011
import io.swagger.codegen.v3.SupportingFile;
1112
import io.swagger.codegen.v3.generators.DefaultCodegenConfig;
13+
import io.swagger.v3.oas.models.media.ArraySchema;
14+
import io.swagger.v3.oas.models.media.BooleanSchema;
15+
import io.swagger.v3.oas.models.media.DateSchema;
16+
import io.swagger.v3.oas.models.media.DateTimeSchema;
17+
import io.swagger.v3.oas.models.media.IntegerSchema;
18+
import io.swagger.v3.oas.models.media.MapSchema;
19+
import io.swagger.v3.oas.models.media.NumberSchema;
20+
import io.swagger.v3.oas.models.media.ObjectSchema;
21+
import io.swagger.v3.oas.models.media.Schema;
22+
import io.swagger.v3.oas.models.media.StringSchema;
23+
import io.swagger.v3.oas.models.security.SecurityScheme;
24+
import io.swagger.v3.parser.util.SchemaTypeUtil;
25+
import org.apache.commons.lang3.StringUtils;
26+
import org.slf4j.Logger;
27+
import org.slf4j.LoggerFactory;
1228

1329
import java.io.File;
14-
import java.util.Arrays;
1530
import java.util.ArrayList;
31+
import java.util.Arrays;
1632
import java.util.Collections;
1733
import java.util.HashMap;
34+
import java.util.HashSet;
1835
import java.util.List;
1936
import java.util.Map;
20-
import java.util.HashSet;
2137
import java.util.regex.Matcher;
2238

23-
import io.swagger.v3.oas.models.media.*;
24-
import io.swagger.v3.oas.models.security.SecurityScheme;
25-
import io.swagger.v3.parser.util.SchemaTypeUtil;
26-
import org.apache.commons.lang3.StringUtils;
27-
28-
import org.slf4j.Logger;
29-
import org.slf4j.LoggerFactory;
30-
3139
import static io.swagger.codegen.v3.generators.handlebars.ExtensionHelper.getBooleanValue;
3240

3341
public class PhpClientCodegen extends DefaultCodegenConfig {
@@ -444,6 +452,12 @@ public void setComposerProjectName(String composerProjectName) {
444452
this.composerProjectName = composerProjectName;
445453
}
446454

455+
@Override
456+
protected void processMapSchema(CodegenModel codegenModel, String name, Schema schema) {
457+
super.processMapSchema(codegenModel, name, schema);
458+
addVars(codegenModel, schema.getProperties(), schema.getRequired());
459+
}
460+
447461
@Override
448462
public String toVarName(String name) {
449463
// sanitize name

src/main/java/io/swagger/codegen/v3/generators/python/PythonClientCodegen.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,8 @@ public void processOpts() {
174174
}
175175

176176
if (additionalProperties.containsKey(CodegenConstants.PROJECT_NAME)) {
177-
setProjectName((String) additionalProperties.get(CodegenConstants.PROJECT_NAME));
177+
String projectName = (String) additionalProperties.get(CodegenConstants.PROJECT_NAME);
178+
setProjectName(projectName.replaceAll("[^a-zA-Z0-9\\s\\-_]",""));
178179
}
179180
else {
180181
// default: set project based on package name
@@ -468,6 +469,10 @@ public String toParamName(String name) {
468469

469470
@Override
470471
public String toModelName(String name) {
472+
if (name == null) {
473+
// sanitizeName will return "Object" for null, but this is called "object" in python
474+
return "object";
475+
}
471476
name = sanitizeName(name); // FIXME: a parameter should not be assigned. Also declare the methods parameters as 'final'.
472477
// remove dollar sign
473478
name = name.replaceAll("$", "");

src/main/java/io/swagger/codegen/v3/generators/typescript/TypeScriptAngularClientCodegen.java

Lines changed: 61 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -123,20 +123,6 @@ public void processOpts() {
123123
additionalProperties.put(NG_PACKAGR, true);
124124
}
125125

126-
// Set the typescript version compatible to the Angular version
127-
if (ngVersion.atLeast("8.0.0")) {
128-
additionalProperties.put("tsVersion", ">=3.4.0 <3.6.0");
129-
} else if (ngVersion.atLeast("7.0.0")) {
130-
additionalProperties.put("tsVersion", ">=3.1.1 <3.2.0");
131-
} else if (ngVersion.atLeast("6.0.0")) {
132-
additionalProperties.put("tsVersion", ">=2.7.2 and <2.10.0");
133-
} else if (ngVersion.atLeast("5.0.0")) {
134-
additionalProperties.put("tsVersion", ">=2.1.5 <2.7.0");
135-
} else {
136-
// Angular v2-v4 requires typescript ">=2.1.5 <2.8"
137-
additionalProperties.put("tsVersion", ">=2.1.5 <2.8.0");
138-
}
139-
140126
// Set the rxJS version compatible to the Angular version
141127
if (ngVersion.atLeast("8.0.0")) {
142128
additionalProperties.put("rxjsVersion", "6.5.0");
@@ -155,6 +141,11 @@ public void processOpts() {
155141
supportingFiles.add(new SupportingFile("rxjs-operators.mustache", getIndexDirectory(), "rxjs-operators.ts"));
156142
}
157143

144+
// Version after Angular 10 require ModuleWithProviders to be generic. Compatible from version 7.
145+
if (ngVersion.atLeast("7.0.0")) {
146+
additionalProperties.put("genericModuleWithProviders", true);
147+
}
148+
158149
// for Angular 2 AOT support we will use good-old ngc,
159150
// Angular Package format wasn't invented at this time and building was much more easier
160151
if (!ngVersion.atLeast("4.0.0")) {
@@ -169,50 +160,6 @@ public void processOpts() {
169160
// Libraries generated with v2.x of ng-packagr will ship with AoT metadata in v4, which is intended for Angular v5 (and Angular v6).
170161
additionalProperties.put("useOldNgPackagr", !ngVersion.atLeast("5.0.0"));
171162

172-
// Specific ng-packagr configuration
173-
if (ngVersion.atLeast("8.0.0")) {
174-
additionalProperties.put("ngPackagrVersion", "5.4.0");
175-
additionalProperties.put("tsickleVersion", "0.35.0");
176-
} else if (ngVersion.atLeast("7.0.0")) {
177-
// compatible versions with typescript version
178-
additionalProperties.put("ngPackagrVersion", "5.1.0");
179-
additionalProperties.put("tsickleVersion", "0.34.0");
180-
} else if (ngVersion.atLeast("6.0.0")) {
181-
// compatible versions with typescript version
182-
additionalProperties.put("ngPackagrVersion", "3.0.6");
183-
additionalProperties.put("tsickleVersion", "0.32.1");
184-
} else if (ngVersion.atLeast("5.0.0")) {
185-
// compatible versions with typescript version
186-
additionalProperties.put("ngPackagrVersion", "2.4.5");
187-
additionalProperties.put("tsickleVersion", "0.27.5");
188-
} else {
189-
// Angular versions prior to v5
190-
additionalProperties.put("ngPackagrVersion", "1.6.0");
191-
}
192-
193-
// set zone.js version
194-
if (ngVersion.atLeast("8.0.0")) {
195-
additionalProperties.put("zonejsVersion", "0.9.1");
196-
} else if (ngVersion.atLeast("5.0.0")) {
197-
// compatible versions to Angular 5+
198-
additionalProperties.put("zonejsVersion", "0.8.26");
199-
} else {
200-
// Angular versions prior to v5
201-
additionalProperties.put("zonejsVersion", "0.7.6");
202-
}
203-
204-
// set http client usage
205-
if (ngVersion.atLeast("8.0.0")) {
206-
additionalProperties.put("useHttpClient", true);
207-
additionalProperties.put("useHttpClientPackage", false);
208-
} else if (ngVersion.atLeast("4.3.0")) {
209-
additionalProperties.put("useHttpClient", true);
210-
additionalProperties.put("useHttpClientPackage", true);
211-
} else {
212-
additionalProperties.put("useHttpClient", false);
213-
additionalProperties.put("useHttpClientPackage", false);
214-
}
215-
216163
if (additionalProperties.containsKey(PROVIDED_IN_ROOT) && !ngVersion.atLeast("6.0.0")) {
217164
additionalProperties.put(PROVIDED_IN_ROOT,false);
218165
}
@@ -221,7 +168,7 @@ public void processOpts() {
221168
additionalProperties.put("injectionTokenTyped", ngVersion.atLeast("4.0.0"));
222169

223170
if (additionalProperties.containsKey(NPM_NAME)) {
224-
addNpmPackageGeneration();
171+
addNpmPackageGeneration(ngVersion);
225172
}
226173

227174
if (additionalProperties.containsKey(WITH_INTERFACES)) {
@@ -247,7 +194,7 @@ private SemVer determineNgVersion() {
247194
return ngVersion;
248195
}
249196

250-
private void addNpmPackageGeneration() {
197+
private void addNpmPackageGeneration(SemVer ngVersion) {
251198
if (additionalProperties.containsKey(NPM_NAME)) {
252199
this.setNpmName(additionalProperties.get(NPM_NAME).toString());
253200
}
@@ -266,6 +213,60 @@ private void addNpmPackageGeneration() {
266213
this.setNpmRepository(additionalProperties.get(NPM_REPOSITORY).toString());
267214
}
268215

216+
additionalProperties.put("useRxJS6", true);
217+
additionalProperties.put("useHttpClient", true);
218+
additionalProperties.put("useHttpClientPackage", false);
219+
if (ngVersion.atLeast("11.0.0")) {
220+
additionalProperties.put("tsVersion", ">=4.0.0 <4.1.0");
221+
additionalProperties.put("rxjsVersion", "6.6.0");
222+
additionalProperties.put("ngPackagrVersion", "11.0.2");
223+
additionalProperties.put("tsickleVersion", "0.39.1");
224+
additionalProperties.put("zonejsVersion", "0.11.3");
225+
} else if (ngVersion.atLeast("10.0.0")) {
226+
additionalProperties.put("tsVersion", ">=3.9.2 <4.0.0");
227+
additionalProperties.put("rxjsVersion", "6.6.0");
228+
additionalProperties.put("ngPackagrVersion", "10.0.3");
229+
additionalProperties.put("tsickleVersion", "0.39.1");
230+
additionalProperties.put("zonejsVersion", "0.10.2");
231+
} else if (ngVersion.atLeast("9.0.0")) {
232+
additionalProperties.put("tsVersion", ">=3.6.0 <3.8.0");
233+
additionalProperties.put("rxjsVersion", "6.5.3");
234+
additionalProperties.put("ngPackagrVersion", "9.0.1");
235+
additionalProperties.put("tsickleVersion", "0.38.0");
236+
additionalProperties.put("zonejsVersion", "0.10.2");
237+
} else if (ngVersion.atLeast("8.0.0")) {
238+
additionalProperties.put("tsVersion", ">=3.4.0 <3.6.0");
239+
additionalProperties.put("rxjsVersion", "6.5.0");
240+
additionalProperties.put("ngPackagrVersion", "5.4.0");
241+
additionalProperties.put("tsickleVersion", "0.35.0");
242+
additionalProperties.put("zonejsVersion", "0.9.1");
243+
} else if (ngVersion.atLeast("7.0.0")) {
244+
additionalProperties.put("tsVersion", ">=3.1.1 <3.2.0");
245+
additionalProperties.put("rxjsVersion", "6.3.0");
246+
additionalProperties.put("ngPackagrVersion", "5.1.0");
247+
additionalProperties.put("tsickleVersion", "0.34.0");
248+
additionalProperties.put("zonejsVersion", "0.8.26");
249+
250+
additionalProperties.put("useHttpClientPackage", true);
251+
} else if (ngVersion.atLeast("6.0.0")) {
252+
additionalProperties.put("tsVersion", ">=2.7.2 and <2.10.0");
253+
additionalProperties.put("rxjsVersion", "6.1.0");
254+
additionalProperties.put("ngPackagrVersion", "3.0.6");
255+
additionalProperties.put("tsickleVersion", "0.32.1");
256+
additionalProperties.put("zonejsVersion", "0.8.26");
257+
258+
additionalProperties.put("useHttpClientPackage", true);
259+
} else {
260+
additionalProperties.put("tsVersion", ">=2.1.5 and <2.8");
261+
additionalProperties.put("rxjsVersion", "6.1.0");
262+
additionalProperties.put("ngPackagrVersion", "3.0.6");
263+
additionalProperties.put("tsickleVersion", "0.32.1");
264+
additionalProperties.put("zonejsVersion", "0.8.26");
265+
266+
additionalProperties.put("useRxJS6", false);
267+
additionalProperties.put("useHttpClientPackage", true);
268+
}
269+
269270
//Files for building our lib
270271
supportingFiles.add(new SupportingFile("README.mustache", getIndexDirectory(), "README.md"));
271272
supportingFiles.add(new SupportingFile("package.mustache", getIndexDirectory(), "package.json"));

src/main/resources/handlebars/aspnetcore/model.mustache

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,12 @@ namespace {{packageName}}.Models
2828
{{/description}}
2929
{{#required}}
3030
[Required]
31-
{{/required}}
31+
{{/required}}{{#pattern}}
32+
[RegularExpression("{{{pattern}}}")]{{/pattern}}{{#minLength}}{{#maxLength}}
33+
[StringLength({{maxLength}}, MinimumLength={{minLength}})]{{/maxLength}}{{/minLength}}{{#minLength}}{{^maxLength}}
34+
[MinLength({{minLength}})]{{/maxLength}}{{/minLength}}{{^minLength}}{{#maxLength}}
35+
[MaxLength({{maxLength}})]{{/maxLength}}{{/minLength}}{{#minimum}}{{#maximum}}
36+
[Range({{minimum}}, {{maximum}})]{{/maximum}}{{/minimum}}
3237
[DataMember(Name="{{baseName}}")]
3338
{{#isEnum}}
3439
public {{{datatypeWithEnum}}}{{#isEnum}}{{^isContainer}}?{{/isContainer}}{{/isEnum}} {{name}} { get; set; }

src/main/resources/handlebars/python/api_client.mustache

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -530,10 +530,14 @@ class ApiClient(object):
530530
filename = re.search(r'filename=[\'"]?([^\'"\s]+)[\'"]?',
531531
content_disposition).group(1)
532532
path = os.path.join(os.path.dirname(path), filename)
533-
534-
with open(path, "wb") as f:
535-
f.write(response.data)
536-
533+
response_data = response.data
534+
with open(path, "wb") as f:
535+
if isinstance(response_data, str):
536+
# change str to bytes so we can write it
537+
response_data = response_data.encode('utf-8')
538+
f.write(response_data)
539+
else:
540+
f.write(response_data)
537541
return path
538542

539543
def __deserialize_primitive(self, data, klass):

0 commit comments

Comments
 (0)