Skip to content

Commit e2d5b2b

Browse files
committed
Merge branch 'master' into bugfix/pageable-scan-resolve-allof-constraints
2 parents 94ed6c5 + 07516b0 commit e2d5b2b

25 files changed

Lines changed: 388 additions & 66 deletions

docs/generators/swift5.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,9 @@ These options may be applied as additional-properties (cli) or configOptions (pl
1818

1919
| Option | Description | Values | Default |
2020
| ------ | ----------- | ------ | ------- |
21+
|additionalModelEnumAttributes|Additional Swift attributes prepended to generated model enum declarations (e.g. @CasePathable, @dynamicMemberLookup, custom @attached macros). List separated by semicolon (;) or new line (Linux or Windows).| |null|
22+
|additionalModelImports|Additional Swift modules to import in every generated model file. List separated by semicolon (;) or new line (Linux or Windows).| |null|
23+
|additionalModelObjectAttributes|Additional Swift attributes prepended to generated model struct/class declarations (e.g. @MainActor, custom @attached macros). List separated by semicolon (;) or new line (Linux or Windows).| |null|
2124
|allowUnicodeIdentifiers|boolean, toggles whether unicode identifiers are allowed in names or not, default is false| |false|
2225
|apiNamePrefix|Prefix that will be appended to all API names ('tags'). Default: empty string. e.g. Pet => Pet.| |null|
2326
|disallowAdditionalPropertiesIfNotPresent|If false, the 'additionalProperties' implementation (set to true by default) is compliant with the OAS and JSON schema specifications. If true (default), keep the old (incorrect) behaviour that 'additionalProperties' is set to false by default.|<dl><dt>**false**</dt><dd>The 'additionalProperties' implementation is compliant with the OAS and JSON schema specifications.</dd><dt>**true**</dt><dd>Keep the old (incorrect) behaviour that 'additionalProperties' is set to false by default.</dd></dl>|true|

docs/generators/swift6.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,9 @@ These options may be applied as additional-properties (cli) or configOptions (pl
1818

1919
| Option | Description | Values | Default |
2020
| ------ | ----------- | ------ | ------- |
21+
|additionalModelEnumAttributes|Additional Swift attributes prepended to generated model enum declarations (e.g. @CasePathable, @dynamicMemberLookup, custom @attached macros). List separated by semicolon (;) or new line (Linux or Windows).| |null|
22+
|additionalModelImports|Additional Swift modules to import in every generated model file. List separated by semicolon (;) or new line (Linux or Windows).| |null|
23+
|additionalModelObjectAttributes|Additional Swift attributes prepended to generated model struct/class declarations (e.g. @MainActor, custom @attached macros). List separated by semicolon (;) or new line (Linux or Windows).| |null|
2124
|allowUnicodeIdentifiers|boolean, toggles whether unicode identifiers are allowed in names or not, default is false| |false|
2225
|apiNamePrefix|Prefix that will be appended to all API names ('tags'). Default: empty string. e.g. Pet =&gt; Pet.| |null|
2326
|apiStaticMethod|Make api calls using a static method (default: true)| |true|

modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenConstants.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -506,4 +506,6 @@ public static enum ENUM_PROPERTY_NAMING_TYPE {camelCase, PascalCase, snake_case,
506506
public static final String X_DISCRIMINATOR_VALUE = "x-discriminator-value";
507507
public static final String X_ONE_OF_NAME = "x-one-of-name";
508508
public static final String X_NULLABLE = "x-nullable";
509+
public static final String X_ENUM_VARNAMES = "x-enum-varnames";
510+
public static final String X_ENUM_DESCRIPTIONS = "x-enum-descriptions";
509511
}

modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java

Lines changed: 40 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@
8282
import java.util.concurrent.ConcurrentHashMap;
8383
import java.util.concurrent.ConcurrentSkipListSet;
8484
import java.util.concurrent.TimeUnit;
85+
import java.util.function.BiFunction;
8586
import java.util.function.Consumer;
8687
import java.util.function.Function;
8788
import java.util.regex.Matcher;
@@ -7030,29 +7031,63 @@ private String getUniqueEnumName(String name, List<Map<String, Object>> enumVars
70307031
: name;
70317032
}
70327033

7034+
/**
7035+
* Update enum vars with extensions.
7036+
*
7037+
* @param enumVars list of enum vars
7038+
* @param vendorExtensions vendor extensions
7039+
* @param dataType data type
7040+
*/
70337041
protected void updateEnumVarsWithExtensions(List<Map<String, Object>> enumVars, Map<String, Object> vendorExtensions, String dataType) {
70347042
if (vendorExtensions != null) {
7035-
updateEnumVarsWithExtensions(enumVars, vendorExtensions, "x-enum-varnames", "name", dataType);
7036-
updateEnumVarsWithExtensions(enumVars, vendorExtensions, "x-enum-descriptions", "enumDescription", dataType);
7043+
updateEnumVarsWithExtensions(enumVars, vendorExtensions, X_ENUM_VARNAMES, "name", dataType);
7044+
updateEnumVarsWithExtensions(enumVars, vendorExtensions, X_ENUM_DESCRIPTIONS, "enumDescription", dataType);
70377045
}
70387046
}
70397047

7040-
private void updateEnumVarsWithExtensions(List<Map<String, Object>> enumVars, Map<String, Object> vendorExtensions, String extensionKey, String key, String dataType) {
7048+
/**
7049+
* Update enum vars with extensions.
7050+
*
7051+
* @param enumVars list of enum vars
7052+
* @param vendorExtensions vendor extensions
7053+
* @param extensionKey extension key
7054+
* @param key key
7055+
* @param dataType data type
7056+
*/
7057+
protected void updateEnumVarsWithExtensions(List<Map<String, Object>> enumVars, Map<String, Object> vendorExtensions, String extensionKey, String key, String dataType) {
7058+
updateEnumVarsWithExtensions(enumVars, vendorExtensions, extensionKey, key, dataType, (a, b) -> a);
7059+
}
7060+
7061+
/**
7062+
* Update enum vars with extensions.
7063+
*
7064+
* @param enumVars list of enum vars
7065+
* @param vendorExtensions vendor extensions
7066+
* @param extensionKey extension key
7067+
* @param dataType data type
7068+
* @param enumDataTypeMapping functions that accepts 2 arguments
7069+
*/
7070+
protected void updateEnumVarsWithExtensions(List<Map<String, Object>> enumVars,
7071+
Map<String, Object> vendorExtensions,
7072+
String extensionKey,
7073+
String key,
7074+
String dataType,
7075+
BiFunction<String, String, String> enumDataTypeMapping) {
70417076
if (vendorExtensions.containsKey(extensionKey)) {
70427077
Object extensionValue = vendorExtensions.get(extensionKey);
70437078
if (extensionValue instanceof List) {
70447079
List<String> values = (List<String>) extensionValue;
70457080
int size = Math.min(enumVars.size(), values.size());
70467081
for (int i = 0; i < size; i++) {
7047-
enumVars.get(i).put(key, values.get(i));
7082+
enumVars.get(i).put(key, enumDataTypeMapping.apply(values.get(i), dataType));
70487083
}
70497084
} else if (extensionValue instanceof Map) {
70507085
Map<String, String> valueMap = (Map<String, String>) extensionValue;
70517086
for (Map<String, Object> enumVar : enumVars) {
70527087
String enumValue = (String) enumVar.get("value");
70537088
for (Map.Entry<String, String> entry : valueMap.entrySet()) {
70547089
if (toEnumValue(entry.getKey(), dataType).equals(enumValue)) {
7055-
enumVar.put(key, entry.getValue());
7090+
enumVar.put(key, enumDataTypeMapping.apply(entry.getValue(), dataType));
70567091
break;
70577092
}
70587093
}

modules/openapi-generator/src/main/java/org/openapitools/codegen/OpenAPINormalizer.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1510,7 +1510,7 @@ protected Schema createSimplifiedEnumSchema(Schema originalSchema, Map<Object, S
15101510
originalSchema.setEnum(new ArrayList<>(enumValues.keySet()));
15111511
if(enumValues.values().stream().anyMatch(e -> !e.isEmpty())) {
15121512
//set x-enum-descriptions only if there's at least one non-empty description
1513-
originalSchema.addExtension("x-enum-descriptions", new ArrayList<>(enumValues.values()));
1513+
originalSchema.addExtension(X_ENUM_DESCRIPTIONS, new ArrayList<>(enumValues.values()));
15141514
}
15151515

15161516
LOGGER.debug("Simplified {} with enum sub-schemas to single enum: {}", composedType, originalSchema);

modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractPhpCodegen.java

Lines changed: 4 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@
3838
import java.util.regex.Matcher;
3939
import java.util.regex.Pattern;
4040

41+
import static org.openapitools.codegen.CodegenConstants.X_ENUM_DESCRIPTIONS;
42+
import static org.openapitools.codegen.CodegenConstants.X_ENUM_VARNAMES;
4143
import static org.openapitools.codegen.utils.CamelizeOption.LOWERCASE_FIRST_LETTER;
4244
import static org.openapitools.codegen.utils.CamelizeOption.UPPERCASE_FIRST_CHAR;
4345
import static org.openapitools.codegen.utils.StringUtils.camelize;
@@ -753,49 +755,8 @@ public void setParameterExampleValue(CodegenParameter p) {
753755
@Override
754756
protected void updateEnumVarsWithExtensions(List<Map<String, Object>> enumVars, Map<String, Object> vendorExtensions, String dataType) {
755757
if (vendorExtensions != null) {
756-
if (vendorExtensions.containsKey("x-enum-varnames")) {
757-
Object extensionValue = vendorExtensions.get("x-enum-varnames");
758-
if (extensionValue instanceof List) {
759-
List<String> values = (List<String>) extensionValue;
760-
int size = Math.min(enumVars.size(), values.size());
761-
for (int i = 0; i < size; i++) {
762-
enumVars.get(i).put("name", toEnumVarName(values.get(i), dataType));
763-
}
764-
} else if (extensionValue instanceof Map) {
765-
Map<String, String> valueMap = (Map<String, String>) extensionValue;
766-
for (Map<String, Object> enumVar : enumVars) {
767-
String enumValue = (String) enumVar.get("value");
768-
for (Map.Entry<String, String> entry : valueMap.entrySet()) {
769-
if (toEnumValue(entry.getKey(), dataType).equals(enumValue)) {
770-
enumVar.put("name", toEnumVarName(entry.getValue(), dataType));
771-
break;
772-
}
773-
}
774-
}
775-
}
776-
}
777-
778-
if (vendorExtensions.containsKey("x-enum-descriptions")) {
779-
Object extensionValue = vendorExtensions.get("x-enum-descriptions");
780-
if (extensionValue instanceof List) {
781-
List<String> values = (List<String>) extensionValue;
782-
int size = Math.min(enumVars.size(), values.size());
783-
for (int i = 0; i < size; i++) {
784-
enumVars.get(i).put("enumDescription", values.get(i));
785-
}
786-
} else if (extensionValue instanceof Map) {
787-
Map<String, String> valueMap = (Map<String, String>) extensionValue;
788-
for (Map<String, Object> enumVar : enumVars) {
789-
String enumValue = (String) enumVar.get("value");
790-
for (Map.Entry<String, String> entry : valueMap.entrySet()) {
791-
if (toEnumValue(entry.getKey(), dataType).equals(enumValue)) {
792-
enumVar.put("enumDescription", entry.getValue());
793-
break;
794-
}
795-
}
796-
}
797-
}
798-
}
758+
updateEnumVarsWithExtensions(enumVars, vendorExtensions, X_ENUM_VARNAMES, "name", dataType, this::toEnumVarName);
759+
updateEnumVarsWithExtensions(enumVars, vendorExtensions, X_ENUM_DESCRIPTIONS, "enumDescription", dataType);
799760
}
800761
}
801762

modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractPythonCodegen.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,7 @@
4242
import java.util.regex.Pattern;
4343
import java.util.stream.Collectors;
4444

45-
import static org.openapitools.codegen.CodegenConstants.X_MODIFIERS;
46-
import static org.openapitools.codegen.CodegenConstants.X_REGEX;
45+
import static org.openapitools.codegen.CodegenConstants.*;
4746
import static org.openapitools.codegen.utils.StringUtils.*;
4847

4948

@@ -1064,13 +1063,13 @@ private ModelsMap postProcessModelsMap(ModelsMap objs) {
10641063
if ((Boolean) enumVars.get("isString")) {
10651064
model.vendorExtensions.putIfAbsent("x-py-enum-type", "str");
10661065
// Do not overwrite the variable name if already set through x-enum-varnames
1067-
if (model.vendorExtensions.get("x-enum-varnames") == null) {
1066+
if (model.vendorExtensions.get(X_ENUM_VARNAMES) == null) {
10681067
enumVars.put("name", toEnumVariableName((String) enumVars.get("value"), "str"));
10691068
}
10701069
} else {
10711070
model.vendorExtensions.putIfAbsent("x-py-enum-type", "int");
10721071
// Do not overwrite the variable name if already set through x-enum-varnames
1073-
if (model.vendorExtensions.get("x-enum-varnames") == null) {
1072+
if (model.vendorExtensions.get(X_ENUM_VARNAMES) == null) {
10741073
enumVars.put("name", toEnumVariableName((String) enumVars.get("value"), "int"));
10751074
}
10761075
}

modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/Swift5ClientCodegen.java

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
import java.time.temporal.ChronoField;
4242
import java.util.*;
4343
import java.util.concurrent.TimeUnit;
44+
import java.util.stream.Collectors;
4445

4546
import static org.openapitools.codegen.utils.CamelizeOption.LOWERCASE_FIRST_LETTER;
4647
import static org.openapitools.codegen.utils.StringUtils.camelize;
@@ -81,6 +82,9 @@ public class Swift5ClientCodegen extends DefaultCodegen implements CodegenConfig
8182
public static final String MAP_FILE_BINARY_TO_DATA = "mapFileBinaryToData";
8283
public static final String USE_CUSTOM_DATE_WITHOUT_TIME = "useCustomDateWithoutTime";
8384
public static final String VALIDATABLE = "validatable";
85+
public static final String ADDITIONAL_MODEL_OBJECT_ATTRIBUTES = "additionalModelObjectAttributes";
86+
public static final String ADDITIONAL_MODEL_ENUM_ATTRIBUTES = "additionalModelEnumAttributes";
87+
public static final String ADDITIONAL_MODEL_IMPORTS = "additionalModelImports";
8488
protected static final String LIBRARY_ALAMOFIRE = "alamofire";
8589
protected static final String LIBRARY_URLSESSION = "urlsession";
8690
protected static final String LIBRARY_VAPOR = "vapor";
@@ -125,6 +129,12 @@ public class Swift5ClientCodegen extends DefaultCodegen implements CodegenConfig
125129
protected boolean useCustomDateWithoutTime = false;
126130
@Setter
127131
protected boolean validatable = true;
132+
@Getter @Setter
133+
protected List<String> additionalModelObjectAttributes = new LinkedList<>();
134+
@Getter @Setter
135+
protected List<String> additionalModelEnumAttributes = new LinkedList<>();
136+
@Getter @Setter
137+
protected List<String> additionalModelImports = new LinkedList<>();
128138
@Setter
129139
protected String[] responseAs = new String[0];
130140
protected String sourceFolder = swiftPackagePath;
@@ -349,6 +359,18 @@ public Swift5ClientCodegen() {
349359
"Make validation rules and validator for model properties (default: true)")
350360
.defaultValue(Boolean.TRUE.toString()));
351361

362+
cliOptions.add(CliOption.newString(ADDITIONAL_MODEL_OBJECT_ATTRIBUTES,
363+
"Additional Swift attributes prepended to generated model struct/class declarations "
364+
+ "(e.g. @MainActor, custom @attached macros). "
365+
+ "List separated by semicolon (;) or new line (Linux or Windows)."));
366+
cliOptions.add(CliOption.newString(ADDITIONAL_MODEL_ENUM_ATTRIBUTES,
367+
"Additional Swift attributes prepended to generated model enum declarations "
368+
+ "(e.g. @CasePathable, @dynamicMemberLookup, custom @attached macros). "
369+
+ "List separated by semicolon (;) or new line (Linux or Windows)."));
370+
cliOptions.add(CliOption.newString(ADDITIONAL_MODEL_IMPORTS,
371+
"Additional Swift modules to import in every generated model file. "
372+
+ "List separated by semicolon (;) or new line (Linux or Windows)."));
373+
352374
supportedLibraries.put(LIBRARY_URLSESSION, "[DEFAULT] HTTP client: URLSession");
353375
supportedLibraries.put(LIBRARY_ALAMOFIRE, "HTTP client: Alamofire");
354376
supportedLibraries.put(LIBRARY_VAPOR, "HTTP client: Vapor");
@@ -674,6 +696,48 @@ public void processOpts() {
674696
break;
675697
}
676698

699+
if (additionalProperties.containsKey(ADDITIONAL_MODEL_OBJECT_ATTRIBUTES)) {
700+
String value = additionalProperties.get(ADDITIONAL_MODEL_OBJECT_ATTRIBUTES).toString();
701+
setAdditionalModelObjectAttributes(splitAdditionalModelOption(value));
702+
}
703+
if (additionalProperties.containsKey(ADDITIONAL_MODEL_ENUM_ATTRIBUTES)) {
704+
String value = additionalProperties.get(ADDITIONAL_MODEL_ENUM_ATTRIBUTES).toString();
705+
setAdditionalModelEnumAttributes(splitAdditionalModelOption(value));
706+
}
707+
if (additionalProperties.containsKey(ADDITIONAL_MODEL_IMPORTS)) {
708+
String value = additionalProperties.get(ADDITIONAL_MODEL_IMPORTS).toString();
709+
setAdditionalModelImports(splitAdditionalModelOption(value));
710+
}
711+
}
712+
713+
private static List<String> splitAdditionalModelOption(String value) {
714+
return Arrays.stream(SPLIT_ON_SEMICOLON_OR_NEWLINE_REGEX.split(value.trim()))
715+
.map(String::trim)
716+
.filter(s -> !s.isEmpty())
717+
.collect(Collectors.toList());
718+
}
719+
720+
@Override
721+
public Map<String, ModelsMap> postProcessAllModels(Map<String, ModelsMap> objs) {
722+
objs = super.postProcessAllModels(objs);
723+
if (additionalModelObjectAttributes.isEmpty()
724+
&& additionalModelEnumAttributes.isEmpty()
725+
&& additionalModelImports.isEmpty()) {
726+
return objs;
727+
}
728+
for (String modelName : objs.keySet()) {
729+
Map<String, Object> models = (Map<String, Object>) objs.get(modelName);
730+
if (!additionalModelObjectAttributes.isEmpty()) {
731+
models.put(ADDITIONAL_MODEL_OBJECT_ATTRIBUTES, additionalModelObjectAttributes);
732+
}
733+
if (!additionalModelEnumAttributes.isEmpty()) {
734+
models.put(ADDITIONAL_MODEL_ENUM_ATTRIBUTES, additionalModelEnumAttributes);
735+
}
736+
if (!additionalModelImports.isEmpty()) {
737+
models.put(ADDITIONAL_MODEL_IMPORTS, additionalModelImports);
738+
}
739+
}
740+
return objs;
677741
}
678742

679743
@Override

0 commit comments

Comments
 (0)