Skip to content

Commit 81e135e

Browse files
[req] Allow models and apis list properties to span multi-lines and i… (#21536)
* [req] Allow models and apis list properties to span multi-lines and include white space (#19628) * Add comment for DefaultGenerator.getPropertyAsSet * Fix some variable names in DefaultGeneratorTest.testGenerateMultiLinePropertiesIssue19628 --------- Co-authored-by: Chris Gual <cgual@omnidian.com>
1 parent c6b51ff commit 81e135e

File tree

2 files changed

+105
-34
lines changed

2 files changed

+105
-34
lines changed

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

Lines changed: 20 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -626,19 +626,30 @@ private String calculateModelKey(String type, String ref) {
626626
}
627627
}
628628

629+
/**
630+
* this method splits the specified property by commas, trims any results for spaces and
631+
* newlines, and returns them as a Set of Strings. the method will return an empty
632+
* set if the specified property has not been set or is an empty string.
633+
*/
634+
private Set<String> getPropertyAsSet(String propertyName) {
635+
String propertyRaw = GlobalSettings.getProperty(propertyName);
636+
if (propertyRaw == null || propertyRaw.isEmpty()) {
637+
return Collections.emptySet();
638+
}
639+
640+
return Arrays.stream(propertyRaw.split(","))
641+
.map(String::trim)
642+
.collect(Collectors.toSet());
643+
}
644+
629645
private Set<String> modelKeys() {
630646
final Map<String, Schema> schemas = ModelUtils.getSchemas(this.openAPI);
631647
if (schemas == null) {
632648
LOGGER.warn("Skipping generation of models because specification document has no schemas.");
633649
return Collections.emptySet();
634650
}
635651

636-
String modelNames = GlobalSettings.getProperty("models");
637-
Set<String> modelsToGenerate = null;
638-
if (modelNames != null && !modelNames.isEmpty()) {
639-
modelsToGenerate = new HashSet<>(Arrays.asList(modelNames.split(",")));
640-
}
641-
652+
Set<String> modelsToGenerate = getPropertyAsSet(CodegenConstants.MODELS);
642653
Set<String> modelKeys = schemas.keySet();
643654
if (modelsToGenerate != null && !modelsToGenerate.isEmpty()) {
644655
Set<String> updatedKeys = new HashSet<>();
@@ -661,11 +672,7 @@ void generateApis(List<File> files, List<OperationsMap> allOperations, List<Mode
661672
return;
662673
}
663674
Map<String, List<CodegenOperation>> paths = processPaths(this.openAPI.getPaths());
664-
Set<String> apisToGenerate = null;
665-
String apiNames = GlobalSettings.getProperty(CodegenConstants.APIS);
666-
if (apiNames != null && !apiNames.isEmpty()) {
667-
apisToGenerate = new HashSet<>(Arrays.asList(apiNames.split(",")));
668-
}
675+
Set<String> apisToGenerate = getPropertyAsSet(CodegenConstants.APIS);
669676
if (apisToGenerate != null && !apisToGenerate.isEmpty()) {
670677
Map<String, List<CodegenOperation>> updatedPaths = new TreeMap<>();
671678
for (String m : paths.keySet()) {
@@ -827,11 +834,7 @@ void generateWebhooks(List<File> files, List<WebhooksMap> allWebhooks, List<Mode
827834
return;
828835
}
829836
Map<String, List<CodegenOperation>> webhooks = processWebhooks(this.openAPI.getWebhooks());
830-
Set<String> webhooksToGenerate = null;
831-
String webhookNames = GlobalSettings.getProperty(CodegenConstants.WEBHOOKS);
832-
if (webhookNames != null && !webhookNames.isEmpty()) {
833-
webhooksToGenerate = new HashSet<>(Arrays.asList(webhookNames.split(",")));
834-
}
837+
Set<String> webhooksToGenerate = getPropertyAsSet(CodegenConstants.WEBHOOKS);
835838
if (webhooksToGenerate != null && !webhooksToGenerate.isEmpty()) {
836839
Map<String, List<CodegenOperation>> Webhooks = new TreeMap<>();
837840
for (String m : webhooks.keySet()) {
@@ -1064,12 +1067,7 @@ private void generateSupportingFiles(List<File> files, Map<String, Object> bundl
10641067
return;
10651068
}
10661069

1067-
Set<String> supportingFilesToGenerate = null;
1068-
String supportingFiles = GlobalSettings.getProperty(CodegenConstants.SUPPORTING_FILES);
1069-
if (supportingFiles != null && !supportingFiles.isEmpty()) {
1070-
supportingFilesToGenerate = new HashSet<>(Arrays.asList(supportingFiles.split(",")));
1071-
}
1072-
1070+
Set<String> supportingFilesToGenerate = getPropertyAsSet(CodegenConstants.SUPPORTING_FILES);
10731071
for (SupportingFile support : config.supportingFiles()) {
10741072
try {
10751073
String outputFolder = config.outputFolder();

modules/openapi-generator/src/test/java/org/openapitools/codegen/DefaultGeneratorTest.java

Lines changed: 85 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -809,11 +809,11 @@ private ClientOptInput createOptInputIssue(String issueNumber, Path target) {
809809
public void testGenerateRecursiveDependentModelsBackwardCompatibilityIssue18444() throws IOException {
810810
Path target = Files.createTempDirectory("test");
811811
File output = target.toFile();
812-
String oldModelsProp = GlobalSettings.getProperty("models");
812+
String oldModelsProp = GlobalSettings.getProperty(CodegenConstants.MODELS);
813813

814814
try {
815815
DefaultGenerator generator = generatorGenerateRecursiveDependentModelsBackwardCompatibility("false");
816-
GlobalSettings.setProperty("models", "RQ1,RS1");
816+
GlobalSettings.setProperty(CodegenConstants.MODELS, "RQ1,RS1");
817817
ClientOptInput clientOptInput = createOptInputIssue18444(target);
818818
List<File> files = generator.opts(clientOptInput).generate();
819819
Assert.assertEquals(files.size(), 17);
@@ -853,9 +853,9 @@ public void testGenerateRecursiveDependentModelsBackwardCompatibilityIssue18444(
853853
} finally {
854854
output.deleteOnExit();
855855
if (oldModelsProp != null) {
856-
GlobalSettings.setProperty("models", oldModelsProp);
856+
GlobalSettings.setProperty(CodegenConstants.MODELS, oldModelsProp);
857857
} else {
858-
GlobalSettings.clearProperty("models");
858+
GlobalSettings.clearProperty(CodegenConstants.MODELS);
859859
}
860860
}
861861
}
@@ -864,11 +864,11 @@ public void testGenerateRecursiveDependentModelsBackwardCompatibilityIssue18444(
864864
public void testGenerateRecursiveDependentModelsIssue18444() throws IOException {
865865
Path target = Files.createTempDirectory("test");
866866
File output = target.toFile();
867-
String oldModelsProp = GlobalSettings.getProperty("models");
867+
String oldModelsProp = GlobalSettings.getProperty(CodegenConstants.MODELS);
868868

869869
try {
870870
DefaultGenerator generator = generatorGenerateRecursiveDependentModelsBackwardCompatibility("true");
871-
GlobalSettings.setProperty("models", "RQ1,RS1");
871+
GlobalSettings.setProperty(CodegenConstants.MODELS, "RQ1,RS1");
872872
ClientOptInput clientOptInput = createOptInputIssue18444(target);
873873
List<File> files = generator.opts(clientOptInput).generate();
874874
Assert.assertEquals(files.size(), 21);
@@ -908,9 +908,9 @@ public void testGenerateRecursiveDependentModelsIssue18444() throws IOException
908908
} finally {
909909
output.deleteOnExit();
910910
if (oldModelsProp != null) {
911-
GlobalSettings.setProperty("models", oldModelsProp);
911+
GlobalSettings.setProperty(CodegenConstants.MODELS, oldModelsProp);
912912
} else {
913-
GlobalSettings.clearProperty("models");
913+
GlobalSettings.clearProperty(CodegenConstants.MODELS);
914914
}
915915
}
916916
}
@@ -919,11 +919,11 @@ public void testGenerateRecursiveDependentModelsIssue18444() throws IOException
919919
public void testGenerateRecursiveDependentModelsIssue19220() throws IOException {
920920
Path target = Files.createTempDirectory("test");
921921
File output = target.toFile();
922-
String oldModelsProp = GlobalSettings.getProperty("models");
922+
String oldModelsProp = GlobalSettings.getProperty(CodegenConstants.MODELS);
923923

924924
try {
925925
DefaultGenerator generator = generatorGenerateRecursiveDependentModelsBackwardCompatibility("true");
926-
GlobalSettings.setProperty("models", "RQ1,RS1");
926+
GlobalSettings.setProperty(CodegenConstants.MODELS, "RQ1,RS1");
927927
ClientOptInput clientOptInput = createOptInputIssue19220(target);
928928
List<File> files = generator.opts(clientOptInput).generate();
929929
Assert.assertEquals(files.size(), 21);
@@ -963,11 +963,84 @@ public void testGenerateRecursiveDependentModelsIssue19220() throws IOException
963963
} finally {
964964
output.deleteOnExit();
965965
if (oldModelsProp != null) {
966-
GlobalSettings.setProperty("models", oldModelsProp);
966+
GlobalSettings.setProperty(CodegenConstants.MODELS, oldModelsProp);
967967
} else {
968-
GlobalSettings.clearProperty("models");
968+
GlobalSettings.clearProperty(CodegenConstants.MODELS);
969969
}
970970
}
971971
}
972972

973+
@Test
974+
public void testGenerateMultiLinePropertiesIssue19628() throws IOException {
975+
Path target = Files.createTempDirectory("test");
976+
File output = target.toFile();
977+
String multiLineSeparator = ",\n ";
978+
try {
979+
final CodegenConfigurator configurator = new CodegenConfigurator()
980+
.setGeneratorName("java")
981+
.setInputSpec("src/test/resources/3_1/java/petstore.yaml")
982+
.setOutputDir(target.toAbsolutePath().toString());
983+
984+
final ClientOptInput clientOptInput = configurator.toClientOptInput();
985+
DefaultGenerator generator = new DefaultGenerator(true);
986+
987+
generator.setGeneratorPropertyDefault(CodegenConstants.MODELS, "true");
988+
generator.setGeneratorPropertyDefault(CodegenConstants.MODEL_TESTS, "false");
989+
generator.setGeneratorPropertyDefault(CodegenConstants.MODEL_DOCS, "false");
990+
generator.setGeneratorPropertyDefault(CodegenConstants.APIS, "true");
991+
generator.setGeneratorPropertyDefault(CodegenConstants.SUPPORTING_FILES, "true");
992+
generator.setGeneratorPropertyDefault(CodegenConstants.API_DOCS, "false");
993+
generator.setGeneratorPropertyDefault(CodegenConstants.MODEL_TESTS, "false");
994+
generator.setGeneratorPropertyDefault(CodegenConstants.API_TESTS, "false");
995+
996+
List<String> supportingFilesToGenerate = Arrays.asList(
997+
"pom.xml",
998+
".travis.yml",
999+
".gitignore",
1000+
"git_push.sh"
1001+
);
1002+
GlobalSettings.setProperty(CodegenConstants.SUPPORTING_FILES, String.join(multiLineSeparator, supportingFilesToGenerate));
1003+
1004+
List<String> apisToGenerate = Arrays.asList(
1005+
"Pet",
1006+
"User"
1007+
);
1008+
GlobalSettings.setProperty(CodegenConstants.APIS, String.join(multiLineSeparator, apisToGenerate));
1009+
1010+
List<String> modelsToGenerate = Arrays.asList(
1011+
"Category",
1012+
"Pet",
1013+
"Tag",
1014+
"User"
1015+
);
1016+
GlobalSettings.setProperty(CodegenConstants.MODELS, String.join(multiLineSeparator, modelsToGenerate));
1017+
1018+
List<File> files = generator.opts(clientOptInput).generate();
1019+
1020+
Assert.assertEquals(
1021+
files.size(),
1022+
// version file + files specified by properties
1023+
1 + supportingFilesToGenerate.size() + modelsToGenerate.size() + apisToGenerate.size()
1024+
);
1025+
1026+
TestUtils.ensureContainsFile(files, output, ".openapi-generator/VERSION");
1027+
for(String supportingFile : supportingFilesToGenerate) {
1028+
TestUtils.ensureContainsFile(files, output, supportingFile);
1029+
}
1030+
1031+
for(String apiFile : apisToGenerate) {
1032+
String filename = "src/main/java/org/openapitools/client/api/" + apiFile + "Api.java";
1033+
TestUtils.ensureContainsFile(files, output, filename);
1034+
}
1035+
1036+
for(String modelFile : modelsToGenerate) {
1037+
String filename = "src/main/java/org/openapitools/client/model/" + modelFile + ".java";
1038+
TestUtils.ensureContainsFile(files, output, filename);
1039+
}
1040+
} finally {
1041+
GlobalSettings.reset();
1042+
output.deleteOnExit();
1043+
}
1044+
1045+
}
9731046
}

0 commit comments

Comments
 (0)