Skip to content

Commit f75cf04

Browse files
committed
[python-fastapi] Check regex pattern on array items
1 parent 930fc30 commit f75cf04

4 files changed

Lines changed: 78 additions & 0 deletions

File tree

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1423,6 +1423,10 @@ public void postProcessParameter(CodegenParameter parameter) {
14231423
@Override
14241424
public void postProcessModelProperty(CodegenModel model, CodegenProperty property) {
14251425
postProcessPattern(property.pattern, property.vendorExtensions);
1426+
1427+
if (property.isArray) {
1428+
postProcessPattern(property.items.pattern, property.items.vendorExtensions);
1429+
}
14261430
}
14271431

14281432
/*

modules/openapi-generator/src/main/resources/python-fastapi/model_generic.mustache

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,36 @@ class {{classname}}({{#parent}}{{{.}}}{{/parent}}{{^parent}}BaseModel{{/parent}}
5050
raise ValueError(r"must validate the regular expression {{{vendorExtensions.x-pattern}}}")
5151
return value
5252
{{/vendorExtensions.x-regex}}
53+
{{#isArray}}
54+
{{#items}}
55+
{{#vendorExtensions.x-regex}}
56+
57+
@field_validator('{{{name}}}')
58+
def {{{name}}}_items_validate_regular_expression(cls, value):
59+
"""Validates the regular expression"""
60+
{{^required}}
61+
if value is None:
62+
return value
63+
{{/required}}
64+
{{#required}}
65+
{{#isNullable}}
66+
if value is None:
67+
return value
68+
{{/isNullable}}
69+
{{/required}}
70+
71+
for item in value:
72+
{{#isNullable}}
73+
if item is None:
74+
continue
75+
76+
{{/isNullable}}
77+
if not re.match(r"{{{.}}}", item{{#vendorExtensions.x-modifiers}} ,re.{{{.}}}{{/vendorExtensions.x-modifiers}}):
78+
raise ValueError(r"must validate the regular expression {{{vendorExtensions.x-pattern}}}")
79+
return value
80+
{{/vendorExtensions.x-regex}}
81+
{{/items}}
82+
{{/isArray}}
5383
{{#isEnum}}
5484

5585
@field_validator('{{{name}}}')

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

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,4 +71,22 @@ public void testNoAdditionalSlashesInQueryRegex() throws IOException {
7171
TestUtils.assertFileContains(Paths.get(output + "/src/openapi_server/apis/default_api.py"),
7272
"r\"^[a-zA-Z0-9]+[a-zA-Z0-9\\.\\-_]*[a-zA-Z0-9]+$\"");
7373
}
74+
75+
@Test
76+
public void testRegexPatternCheckedForArrayItems() throws IOException {
77+
File output = Files.createTempDirectory("test").toFile();
78+
output.deleteOnExit();
79+
80+
final CodegenConfigurator configurator = new CodegenConfigurator()
81+
.setGeneratorName("python-fastapi")
82+
.setOutputDir(output.getAbsolutePath().replace("\\", "/"))
83+
.setInputSpec("src/test/resources/3_1/issue_23102.yaml");
84+
85+
DefaultGenerator generator = new DefaultGenerator();
86+
List<File> files = generator.opts(configurator.toClientOptInput()).generate();
87+
files.forEach(File::deleteOnExit);
88+
89+
TestUtils.assertFileContains(Paths.get(output + "/src/openapi_server/models/test_object.py"),
90+
"raise ValueError(r\"must validate the regular expression /^[A-Z0-9_\\- ]+$/\")");
91+
}
7492
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
openapi: 3.1.0
2+
info:
3+
title: List items regex test
4+
version: 0.0.1
5+
paths:
6+
/test:
7+
get:
8+
responses:
9+
"200":
10+
description: test
11+
content:
12+
application/json:
13+
schema:
14+
$ref: "#/components/schemas/TestObject"
15+
components:
16+
schemas:
17+
TestObject:
18+
properties:
19+
tags:
20+
items:
21+
pattern: "/^[A-Z0-9_\\- ]+$/"
22+
type:
23+
oneOf:
24+
- string
25+
- type: "null"
26+
type: array

0 commit comments

Comments
 (0)