Skip to content

Commit 72dc0cf

Browse files
Fix logic for removal of forward slash in RegGen pattern (#8219)
* rxgen version update * rgxgen version 1.2 * update rgxgen version to 1.3 * remove start end slash in patterns * Remove debug logs * fix logic for removal of backslash * fix logic for forward-slash removal * fix logic for removing unwanted characters in regex * add test for example value for string properties * improvise regex validation logic for example generation * complicate regex examples * regex pattern correction Co-authored-by: aani <aani>
1 parent 87926d0 commit 72dc0cf

3 files changed

Lines changed: 45 additions & 3 deletions

File tree

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

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -797,9 +797,7 @@ private String toExampleValueRecursive(Schema schema, List<String> included_sche
797797
if ("Number".equalsIgnoreCase(schema.getFormat())) {return "1";}
798798
if (StringUtils.isNotBlank(schema.getPattern())) {
799799
String pattern = schema.getPattern();
800-
while (pattern.startsWith("/")) pattern = pattern.substring(0, pattern.length()-1);
801-
while (pattern.endsWith("/")) pattern = pattern.substring(1);
802-
RgxGen rgxGen = new RgxGen(pattern);
800+
RgxGen rgxGen = new RgxGen(patternCorrection(pattern));
803801
// this seed makes it so if we have [a-z] we pick a
804802
Random random = new Random(18);
805803
String sample = rgxGen.generate(random);
@@ -1052,4 +1050,14 @@ public void postProcessFile(File file, String fileType) {
10521050
}
10531051
}
10541052
}
1053+
1054+
public String patternCorrection(String pattern){
1055+
// Java does not recognize starting and ending forward slashes and mode modifiers
1056+
// It considers them as characters with no special meaning and tries to find them in the match string
1057+
boolean checkEnding = pattern.endsWith("/i") || pattern.endsWith("/g") || pattern.endsWith("/m");
1058+
if (checkEnding) pattern = pattern.substring(0, pattern.length()-2);
1059+
if (pattern.endsWith("/")) pattern = pattern.substring(0, pattern.length()-1);
1060+
if (pattern.startsWith("/")) pattern = pattern.substring(1);
1061+
return pattern;
1062+
}
10551063
}

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

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,17 +18,20 @@
1818
package org.openapitools.codegen.python;
1919

2020
import com.google.common.collect.Sets;
21+
import com.sun.org.apache.xpath.internal.operations.Bool;
2122
import io.swagger.v3.oas.models.OpenAPI;
2223
import io.swagger.v3.oas.models.Operation;
2324
import io.swagger.v3.oas.models.media.*;
2425
import io.swagger.v3.parser.util.SchemaTypeUtil;
2526
import org.openapitools.codegen.*;
2627
import org.openapitools.codegen.languages.PythonLegacyClientCodegen;
28+
import org.openapitools.codegen.utils.ModelUtils;
2729
import org.testng.Assert;
2830
import org.testng.annotations.Test;
2931

3032
import java.util.ArrayList;
3133
import java.util.Arrays;
34+
import java.util.regex.Pattern;
3235

3336
public class PythonLegacyClientCodegenTest {
3437

@@ -93,6 +96,25 @@ public void testRegularExpressionOpenAPISchemaVersion3() {
9396
Assert.assertEquals(op.allParams.get(5).pattern, "/^pattern\\d{3}$/i");
9497
}
9598

99+
100+
101+
@Test(description = "test generated example values for string properties")
102+
public void testGeneratedExampleValues() {
103+
final OpenAPI openAPI = TestUtils.parseFlattenSpec("src/test/resources/3_0/examples.yaml");
104+
final PythonLegacyClientCodegen codegen = new PythonLegacyClientCodegen();
105+
codegen.setOpenAPI(openAPI);
106+
final Schema dummyUserSchema = openAPI.getComponents().getSchemas().get("DummyUser");
107+
final Schema nameSchema = (Schema) dummyUserSchema.getProperties().get("name");
108+
final Schema numberSchema = (Schema) dummyUserSchema.getProperties().get("number");
109+
final Schema addressSchema = (Schema) dummyUserSchema.getProperties().get("address");
110+
final String namePattern = codegen.patternCorrection(nameSchema.getPattern());
111+
final String numberPattern = codegen.patternCorrection(numberSchema.getPattern());
112+
final String addressPattern = codegen.patternCorrection(addressSchema.getPattern());
113+
Assert.assertTrue(codegen.escapeQuotationMark(codegen.toExampleValue(nameSchema)).matches(namePattern));
114+
Assert.assertTrue(codegen.escapeQuotationMark(codegen.toExampleValue(numberSchema)).matches(numberPattern));
115+
Assert.assertTrue(codegen.escapeQuotationMark(codegen.toExampleValue(addressSchema)).matches(addressPattern));
116+
}
117+
96118
@Test(description = "test single quotes escape")
97119
public void testSingleQuotes() {
98120
final PythonLegacyClientCodegen codegen = new PythonLegacyClientCodegen();

modules/openapi-generator/src/test/resources/3_0/examples.yaml

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,3 +118,15 @@ components:
118118
properties:
119119
city:
120120
type: string
121+
DummyUser:
122+
type: object
123+
properties:
124+
name:
125+
type: string
126+
pattern: '/^[a-z\s]+$/'
127+
number:
128+
type: string
129+
pattern: '/[0-9]{10}/g'
130+
address:
131+
type: string
132+
pattern: '/^[a-z0-9\s]+$/i'

0 commit comments

Comments
 (0)