Skip to content

Commit 8643bc1

Browse files
[python-fastapi] Remove additional slashes in query regex (#22223)
1 parent 2b22d17 commit 8643bc1

File tree

4 files changed

+41
-2
lines changed

4 files changed

+41
-2
lines changed
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
{{#isPathParam}}{{baseName}}{{/isPathParam}}{{^isPathParam}}{{paramName}}{{/isPathParam}}: {{>param_type}} = {{#isPathParam}}Path{{/isPathParam}}{{#isHeaderParam}}Header{{/isHeaderParam}}{{#isFormParam}}Form{{/isFormParam}}{{#isQueryParam}}Query{{/isQueryParam}}{{#isCookieParam}}Cookie{{/isCookieParam}}{{#isBodyParam}}Body{{/isBodyParam}}({{&defaultValue}}{{^defaultValue}}{{#isPathParam}}...{{/isPathParam}}{{^isPathParam}}None{{/isPathParam}}{{/defaultValue}}, description="{{description}}"{{#isQueryParam}}, alias="{{baseName}}"{{/isQueryParam}}{{#isLong}}{{#minimum}}, ge={{.}}{{/minimum}}{{#maximum}}, le={{.}}{{/maximum}}{{/isLong}}{{#isInteger}}{{#minimum}}, ge={{.}}{{/minimum}}{{#maximum}}, le={{.}}{{/maximum}}{{/isInteger}}{{#pattern}}, regex=r"{{.}}"{{/pattern}}{{#minLength}}, min_length={{.}}{{/minLength}}{{#maxLength}}, max_length={{.}}{{/maxLength}})
1+
{{#isPathParam}}{{baseName}}{{/isPathParam}}{{^isPathParam}}{{paramName}}{{/isPathParam}}: {{>param_type}} = {{#isPathParam}}Path{{/isPathParam}}{{#isHeaderParam}}Header{{/isHeaderParam}}{{#isFormParam}}Form{{/isFormParam}}{{#isQueryParam}}Query{{/isQueryParam}}{{#isCookieParam}}Cookie{{/isCookieParam}}{{#isBodyParam}}Body{{/isBodyParam}}({{&defaultValue}}{{^defaultValue}}{{#isPathParam}}...{{/isPathParam}}{{^isPathParam}}None{{/isPathParam}}{{/defaultValue}}, description="{{description}}"{{#isQueryParam}}, alias="{{baseName}}"{{/isQueryParam}}{{#isLong}}{{#minimum}}, ge={{.}}{{/minimum}}{{#maximum}}, le={{.}}{{/maximum}}{{/isLong}}{{#isInteger}}{{#minimum}}, ge={{.}}{{/minimum}}{{#maximum}}, le={{.}}{{/maximum}}{{/isInteger}}{{#vendorExtensions.x-regex}}, regex=r"{{.}}"{{/vendorExtensions.x-regex}}{{#minLength}}, min_length={{.}}{{/minLength}}{{#maxLength}}, max_length={{.}}{{/maxLength}})

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
@@ -53,4 +53,22 @@ public void testEndpointSpecsWithoutDescription() throws IOException {
5353
TestUtils.assertFileContains(Paths.get(output + "/src/nodesc/apis/desc_api.py"),
5454
"return await BaseDescApi.subclasses[0]().desc()\n");
5555
}
56+
57+
@Test
58+
public void testNoAdditionalSlashesInQueryRegex() throws IOException {
59+
File output = Files.createTempDirectory("test").toFile();
60+
output.deleteOnExit();
61+
62+
final CodegenConfigurator configurator = new CodegenConfigurator()
63+
.setGeneratorName("python-fastapi")
64+
.setOutputDir(output.getAbsolutePath().replace("\\", "/"))
65+
.setInputSpec("src/test/resources/3_1/issue_19823.yaml");
66+
67+
DefaultGenerator generator = new DefaultGenerator();
68+
List<File> files = generator.opts(configurator.toClientOptInput()).generate();
69+
files.forEach(File::deleteOnExit);
70+
71+
TestUtils.assertFileContains(Paths.get(output + "/src/openapi_server/apis/default_api.py"),
72+
"r\"^[a-zA-Z0-9]+[a-zA-Z0-9\\.\\-_]*[a-zA-Z0-9]+$\"");
73+
}
5674
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
openapi: 3.1.0
2+
info:
3+
title: test
4+
version: 0.0.1
5+
paths:
6+
/v1/test:
7+
post:
8+
operationId: test
9+
parameters:
10+
- in: query
11+
name: test
12+
schema:
13+
type: string
14+
pattern: '^[a-zA-Z0-9]+[a-zA-Z0-9\.\-_]*[a-zA-Z0-9]+$'
15+
responses:
16+
"200":
17+
description: test
18+
content:
19+
application/json:
20+
schema:
21+
type: string

samples/server/petstore/python-fastapi/src/openapi_server/apis/user_api.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ async def create_users_with_list_input(
110110
response_model_by_alias=True,
111111
)
112112
async def login_user(
113-
username: Annotated[str, Field(strict=True, description="The user name for login")] = Query(None, description="The user name for login", alias="username", regex=r"/^[a-zA-Z0-9]+[a-zA-Z0-9\.\-_]*[a-zA-Z0-9]+$/"),
113+
username: Annotated[str, Field(strict=True, description="The user name for login")] = Query(None, description="The user name for login", alias="username", regex=r"^[a-zA-Z0-9]+[a-zA-Z0-9\.\-_]*[a-zA-Z0-9]+$"),
114114
password: Annotated[StrictStr, Field(description="The password for login in clear text")] = Query(None, description="The password for login in clear text", alias="password"),
115115
) -> str:
116116
""""""

0 commit comments

Comments
 (0)