Skip to content

Commit 1a31b05

Browse files
diorcetyYann Diorcet
authored andcommitted
Fix python-fastapi signature of parameters for method
1 parent ed2aad6 commit 1a31b05

5 files changed

Lines changed: 102 additions & 2 deletions

File tree

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

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,12 +45,12 @@
4545
import org.apache.commons.lang3.StringUtils;
4646
import org.openapitools.codegen.CodegenConfig;
4747
import org.openapitools.codegen.CodegenConstants;
48-
import org.openapitools.codegen.CodegenDiscriminator;
4948
import org.openapitools.codegen.CodegenMediaType;
5049
import org.openapitools.codegen.CodegenModel;
5150
import org.openapitools.codegen.CodegenOperation;
5251
import org.openapitools.codegen.CodegenParameter;
5352
import org.openapitools.codegen.CodegenProperty;
53+
import org.openapitools.codegen.CodegenResponse;
5454
import org.openapitools.codegen.DefaultCodegen;
5555
import org.openapitools.codegen.GeneratorLanguage;
5656
import org.openapitools.codegen.IJsonSchemaValidationProperties;
@@ -1263,6 +1263,20 @@ public OperationsMap postProcessOperationsWithModels(OperationsMap objs, List<Mo
12631263
);
12641264
}
12651265

1266+
// update typing import for operation responses type
1267+
for (CodegenResponse response : operation.responses) {
1268+
// Not interested in the result, only in the update of the imports
1269+
getPydanticType(
1270+
response.returnProperty,
1271+
modelImports,
1272+
exampleImports,
1273+
postponedModelImports,
1274+
postponedExampleImports,
1275+
moduleImports,
1276+
null
1277+
);
1278+
}
1279+
12661280
// add import for code samples
12671281
// import models one by one
12681282
if (!exampleImports.isEmpty()) {

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -234,6 +234,8 @@ public String getTypeDeclaration(Schema p) {
234234

235235
@Override
236236
public OperationsMap postProcessOperationsWithModels(OperationsMap objs, List<ModelMap> allModels) {
237+
super.postProcessOperationsWithModels(objs, allModels);
238+
237239
OperationMap operations = objs.getOperations();
238240
// Set will make sure that no duplicated items are used.
239241
Set<String> securityImports = new HashSet<>();
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
{{#isString}}str{{/isString}}{{#isInteger}}int{{/isInteger}}{{#isLong}}int{{/isLong}}{{#isFloat}}float{{/isFloat}}{{#isDouble}}float{{/isDouble}}{{#isByteArray}}str{{/isByteArray}}{{#isBinary}}str{{/isBinary}}{{#isBoolean}}bool{{/isBoolean}}{{#isDate}}str{{/isDate}}{{#isDateTime}}str{{/isDateTime}}{{#isModel}}{{dataType}}{{/isModel}}{{#isContainer}}{{dataType}}{{/isContainer}}
1+
{{{vendorExtensions.x-py-typing}}}
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
package org.openapitools.codegen.python;
2+
3+
import com.google.common.collect.Sets;
4+
import io.swagger.parser.OpenAPIParser;
5+
import io.swagger.v3.oas.models.OpenAPI;
6+
import io.swagger.v3.oas.models.Operation;
7+
import io.swagger.v3.oas.models.media.ArraySchema;
8+
import io.swagger.v3.oas.models.media.Schema;
9+
import io.swagger.v3.parser.core.models.ParseOptions;
10+
import org.openapitools.codegen.*;
11+
import org.openapitools.codegen.languages.PythonClientCodegen;
12+
import org.openapitools.codegen.languages.PythonFastAPIServerCodegen;
13+
import org.openapitools.codegen.languages.features.CXFServerFeatures;
14+
import org.testng.Assert;
15+
import org.testng.annotations.Test;
16+
17+
import java.io.File;
18+
import java.io.IOException;
19+
import java.nio.file.Files;
20+
import java.nio.file.Path;
21+
import java.nio.file.Paths;
22+
import java.util.List;
23+
24+
import static org.openapitools.codegen.TestUtils.assertFileContains;
25+
import static org.openapitools.codegen.TestUtils.assertFileExists;
26+
27+
public class PythonFastAPIServerCodegenTest {
28+
29+
// Helper function, intended to reduce boilerplate
30+
static private String generateFiles(DefaultCodegen codegen, String filePath) throws IOException {
31+
final File output = Files.createTempDirectory("test").toFile().getCanonicalFile();
32+
output.deleteOnExit();
33+
final String outputPath = output.getAbsolutePath().replace('\\', '/');
34+
35+
codegen.setOutputDir(output.getAbsolutePath());
36+
codegen.additionalProperties().put(CXFServerFeatures.LOAD_TEST_DATA_FROM_FILE, "true");
37+
38+
final ClientOptInput input = new ClientOptInput();
39+
final OpenAPI openAPI = new OpenAPIParser().readLocation(filePath, null, new ParseOptions()).getOpenAPI();
40+
input.openAPI(openAPI);
41+
input.config(codegen);
42+
43+
final DefaultGenerator generator = new DefaultGenerator();
44+
final List<File> files = generator.opts(input).generate();
45+
46+
Assert.assertTrue(files.size() > 0);
47+
return outputPath + "/";
48+
}
49+
50+
51+
@Test(description = "test containerType in parameters")
52+
public void testContainerType() throws IOException {
53+
final DefaultCodegen codegen = new PythonFastAPIServerCodegen();
54+
final String outputPath = generateFiles(codegen, "src/test/resources/bugs/pr_18691.json");
55+
final Path p = Paths.get(outputPath + "src/openapi_server/apis/default_api.py");
56+
57+
assertFileExists(p);
58+
assertFileContains(p, "body: Optional[Dict[str, Any]] = Body(None, description=\"\"),");
59+
}
60+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
{
2+
"openapi": "3.0.1",
3+
"info": {
4+
"title": "OpenAPI definition",
5+
"version": "v0"
6+
},
7+
"paths": {
8+
"/licensing/token/renew": {
9+
"post": {
10+
"description": "Manually ask license issuer for a new token. Available in Grafana Enterprise v7.4+.\n\nYou need to have a permission with action `licensing:update`.",
11+
"operationId": "postRenewLicenseToken",
12+
"requestBody": {
13+
"content": {
14+
"application/json": {
15+
"schema": {
16+
"type": "object"
17+
}
18+
}
19+
}
20+
}
21+
}
22+
}
23+
}
24+
}

0 commit comments

Comments
 (0)