diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractPythonCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractPythonCodegen.java index 0743275db62a..a4e1bc131f2d 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractPythonCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractPythonCodegen.java @@ -1423,6 +1423,10 @@ public void postProcessParameter(CodegenParameter parameter) { @Override public void postProcessModelProperty(CodegenModel model, CodegenProperty property) { postProcessPattern(property.pattern, property.vendorExtensions); + + if (property.isArray) { + postProcessPattern(property.items.pattern, property.items.vendorExtensions); + } } /* diff --git a/modules/openapi-generator/src/main/resources/python-fastapi/model_generic.mustache b/modules/openapi-generator/src/main/resources/python-fastapi/model_generic.mustache index e5e64a08ebeb..2b59898b9a55 100644 --- a/modules/openapi-generator/src/main/resources/python-fastapi/model_generic.mustache +++ b/modules/openapi-generator/src/main/resources/python-fastapi/model_generic.mustache @@ -50,6 +50,36 @@ class {{classname}}({{#parent}}{{{.}}}{{/parent}}{{^parent}}BaseModel{{/parent}} raise ValueError(r"must validate the regular expression {{{vendorExtensions.x-pattern}}}") return value {{/vendorExtensions.x-regex}} + {{#isArray}} + {{#items}} + {{#vendorExtensions.x-regex}} + + @field_validator('{{{name}}}') + def {{{name}}}_items_validate_regular_expression(cls, value): + """Validates the regular expression""" + {{^required}} + if value is None: + return value + {{/required}} + {{#required}} + {{#isNullable}} + if value is None: + return value + {{/isNullable}} + {{/required}} + + for item in value: + {{#isNullable}} + if item is None: + continue + + {{/isNullable}} + if not re.match(r"{{{.}}}", item{{#vendorExtensions.x-modifiers}} ,re.{{{.}}}{{/vendorExtensions.x-modifiers}}): + raise ValueError(r"must validate the regular expression {{{vendorExtensions.x-pattern}}}") + return value + {{/vendorExtensions.x-regex}} + {{/items}} + {{/isArray}} {{#isEnum}} @field_validator('{{{name}}}') diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/python/PythonFastapiCodegenTest.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/python/PythonFastapiCodegenTest.java index 33b9d46555c5..931d6cd41ce2 100644 --- a/modules/openapi-generator/src/test/java/org/openapitools/codegen/python/PythonFastapiCodegenTest.java +++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/python/PythonFastapiCodegenTest.java @@ -71,4 +71,22 @@ public void testNoAdditionalSlashesInQueryRegex() throws IOException { TestUtils.assertFileContains(Paths.get(output + "/src/openapi_server/apis/default_api.py"), "r\"^[a-zA-Z0-9]+[a-zA-Z0-9\\.\\-_]*[a-zA-Z0-9]+$\""); } + + @Test + public void testRegexPatternCheckedForArrayItems() throws IOException { + File output = Files.createTempDirectory("test").toFile(); + output.deleteOnExit(); + + final CodegenConfigurator configurator = new CodegenConfigurator() + .setGeneratorName("python-fastapi") + .setOutputDir(output.getAbsolutePath().replace("\\", "/")) + .setInputSpec("src/test/resources/3_1/issue_23102.yaml"); + + DefaultGenerator generator = new DefaultGenerator(); + List files = generator.opts(configurator.toClientOptInput()).generate(); + files.forEach(File::deleteOnExit); + + TestUtils.assertFileContains(Paths.get(output + "/src/openapi_server/models/test_object.py"), + "raise ValueError(r\"must validate the regular expression /^[A-Z0-9_\\- ]+$/\")"); + } } diff --git a/modules/openapi-generator/src/test/resources/3_1/issue_23102.yaml b/modules/openapi-generator/src/test/resources/3_1/issue_23102.yaml new file mode 100644 index 000000000000..f0f51f0607ac --- /dev/null +++ b/modules/openapi-generator/src/test/resources/3_1/issue_23102.yaml @@ -0,0 +1,26 @@ +openapi: 3.1.0 +info: + title: List items regex test + version: 0.0.1 +paths: + /test: + get: + responses: + "200": + description: test + content: + application/json: + schema: + $ref: "#/components/schemas/TestObject" +components: + schemas: + TestObject: + properties: + tags: + items: + pattern: "/^[A-Z0-9_\\- ]+$/" + type: + oneOf: + - string + - type: "null" + type: array \ No newline at end of file