* Revert "Minor enhancement to Python client generator's code format (#6510)"

This reverts commit 3ddc78393cf936076778783a956db613b3a07812.

* Revert "[Python][Client] Fix delimiter collision issue #5981 (#6451)"

This reverts commit 6783b90fe230360c58b360817887f418475b745b.
This commit is contained in:
William Cheng 2020-06-01 20:01:06 +08:00 committed by GitHub
parent 3ddc78393c
commit f91a5f7108
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 99 additions and 200 deletions

View File

@ -683,12 +683,8 @@ public class PythonClientCodegen extends DefaultCodegen implements CodegenConfig
if (p.getDefault() != null) { if (p.getDefault() != null) {
if (Pattern.compile("\r\n|\r|\n").matcher((String) p.getDefault()).find()) if (Pattern.compile("\r\n|\r|\n").matcher((String) p.getDefault()).find())
return "'''" + p.getDefault() + "'''"; return "'''" + p.getDefault() + "'''";
else if (p.getEnum() == null)
// wrap using double quotes to avoid the need to escape any embedded single quotes
return "\"" + p.getDefault() + "\"";
else else
// convert to enum var name later in postProcessModels return "'" + ((String) p.getDefault()).replaceAll("'", "\'") + "'";
return (String) p.getDefault();
} }
} else if (ModelUtils.isArraySchema(p)) { } else if (ModelUtils.isArraySchema(p)) {
if (p.getDefault() != null) { if (p.getDefault() != null) {
@ -721,10 +717,8 @@ public class PythonClientCodegen extends DefaultCodegen implements CodegenConfig
} }
// correct "true"s into "True"s, since super.toExampleValue uses "toString()" on Java booleans // correct "true"s into "True"s, since super.toExampleValue uses "toString()" on Java booleans
if (ModelUtils.isBooleanSchema(schema) && null!=example) { if (ModelUtils.isBooleanSchema(schema) && null!=example) {
if ("false".equalsIgnoreCase(example)) if ("false".equalsIgnoreCase(example)) example = "False";
example = "False"; else example = "True";
else
example = "True";
} }
// correct "'"s into "'"s after toString() // correct "'"s into "'"s after toString()
@ -734,8 +728,7 @@ public class PythonClientCodegen extends DefaultCodegen implements CodegenConfig
if (StringUtils.isNotBlank(example) && !"null".equals(example)) { if (StringUtils.isNotBlank(example) && !"null".equals(example)) {
if (ModelUtils.isStringSchema(schema)) { if (ModelUtils.isStringSchema(schema)) {
// wrap using double quotes to avoid the need to escape any embedded single quotes example = "'" + example + "'";
example = "\"" + example + "\"";
} }
return example; return example;
} }
@ -785,20 +778,11 @@ public class PythonClientCodegen extends DefaultCodegen implements CodegenConfig
example = "YQ=="; example = "YQ==";
} else if (ModelUtils.isStringSchema(schema)) { } else if (ModelUtils.isStringSchema(schema)) {
// a BigDecimal: // a BigDecimal:
if ("Number".equalsIgnoreCase(schema.getFormat())) { if ("Number".equalsIgnoreCase(schema.getFormat())) {return "1";}
return "1"; if (StringUtils.isNotBlank(schema.getPattern())) return "'a'"; // I cheat here, since it would be too complicated to generate a string from a regexp
}
if (StringUtils.isNotBlank(schema.getPattern()))
return "'a'"; // I cheat here, since it would be too complicated to generate a string from a regexp
int len = 0; int len = 0;
if (null != schema.getMinLength()) len = schema.getMinLength().intValue();
if (null != schema.getMinLength()) if (len < 1) len = 1;
len = schema.getMinLength().intValue();
if (len < 1)
len = 1;
example = ""; example = "";
for (int i=0;i<len;i++) example += i; for (int i=0;i<len;i++) example += i;
} else if (ModelUtils.isIntegerSchema(schema)) { } else if (ModelUtils.isIntegerSchema(schema)) {
@ -863,8 +847,7 @@ public class PythonClientCodegen extends DefaultCodegen implements CodegenConfig
Map<String, Schema> properties = schema.getProperties(); Map<String, Schema> properties = schema.getProperties();
Set<String> propkeys = null; Set<String> propkeys = null;
if (properties != null) if (properties != null) propkeys = properties.keySet();
propkeys = properties.keySet();
if (toExclude != null && reqs.contains(toExclude)) { if (toExclude != null && reqs.contains(toExclude)) {
reqs.remove(toExclude); reqs.remove(toExclude);
} }
@ -919,7 +902,6 @@ public class PythonClientCodegen extends DefaultCodegen implements CodegenConfig
type = p.dataType; type = p.dataType;
} }
if (type != null) {
if ("String".equalsIgnoreCase(type) || "str".equalsIgnoreCase(type)) { if ("String".equalsIgnoreCase(type) || "str".equalsIgnoreCase(type)) {
if (example == null) { if (example == null) {
example = p.paramName + "_example"; example = p.paramName + "_example";
@ -958,7 +940,6 @@ public class PythonClientCodegen extends DefaultCodegen implements CodegenConfig
} else { } else {
LOGGER.warn("Type " + type + " not handled properly in setParameterExampleValue"); LOGGER.warn("Type " + type + " not handled properly in setParameterExampleValue");
} }
}
if (example == null) { if (example == null) {
example = "None"; example = "None";

View File

@ -17,24 +17,30 @@
package org.openapitools.codegen.languages; package org.openapitools.codegen.languages;
import io.swagger.v3.oas.models.Operation; import io.swagger.v3.oas.models.Operation;
import io.swagger.v3.oas.models.examples.Example;
import io.swagger.v3.oas.models.media.*; import io.swagger.v3.oas.models.media.*;
import io.swagger.v3.oas.models.media.ArraySchema;
import io.swagger.v3.oas.models.media.MediaType;
import io.swagger.v3.oas.models.media.Schema;
import io.swagger.v3.oas.models.parameters.Parameter;
import io.swagger.v3.oas.models.parameters.RequestBody; import io.swagger.v3.oas.models.parameters.RequestBody;
import io.swagger.v3.oas.models.responses.ApiResponse; import io.swagger.v3.oas.models.responses.ApiResponse;
import io.swagger.v3.oas.models.security.SecurityScheme; import io.swagger.v3.oas.models.security.SecurityScheme;
import org.apache.commons.io.FilenameUtils;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.openapitools.codegen.*; import org.openapitools.codegen.*;
import org.openapitools.codegen.examples.ExampleGenerator; import org.openapitools.codegen.examples.ExampleGenerator;
import org.openapitools.codegen.meta.GeneratorMetadata;
import org.openapitools.codegen.meta.Stability;
import org.openapitools.codegen.meta.features.*; import org.openapitools.codegen.meta.features.*;
import org.openapitools.codegen.utils.ModelUtils; import org.openapitools.codegen.utils.ModelUtils;
import org.openapitools.codegen.utils.ProcessUtils; import org.openapitools.codegen.utils.ProcessUtils;
import org.openapitools.codegen.meta.GeneratorMetadata;
import org.openapitools.codegen.meta.Stability;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import java.io.File;
import java.text.DateFormat; import java.text.DateFormat;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.io.File;
import java.util.*; import java.util.*;
import java.util.regex.Pattern; import java.util.regex.Pattern;
@ -899,11 +905,11 @@ public class PythonClientExperimentalCodegen extends PythonClientCodegen {
* Primitive types in the OAS specification are implemented in Python using the corresponding * Primitive types in the OAS specification are implemented in Python using the corresponding
* Python primitive types. * Python primitive types.
* Composed types (e.g. allAll, oneOf, anyOf) are represented in Python using list of types. * Composed types (e.g. allAll, oneOf, anyOf) are represented in Python using list of types.
* <p> *
* The caller should set the prefix and suffix arguments to empty string, except when * The caller should set the prefix and suffix arguments to empty string, except when
* getTypeString invokes itself recursively. A non-empty prefix/suffix may be specified * getTypeString invokes itself recursively. A non-empty prefix/suffix may be specified
* to wrap the return value in a python dict, list or tuple. * to wrap the return value in a python dict, list or tuple.
* <p> *
* Examples: * Examples:
* - "bool, date, float" The data must be a bool, date or float. * - "bool, date, float" The data must be a bool, date or float.
* - "[bool, date]" The data must be an array, and the array items must be a bool or date. * - "[bool, date]" The data must be an array, and the array items must be a bool or date.

View File

@ -19,17 +19,16 @@ package org.openapitools.codegen.python;
import io.swagger.v3.oas.models.OpenAPI; import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.Operation; import io.swagger.v3.oas.models.Operation;
import io.swagger.v3.oas.models.media.Schema;
import io.swagger.v3.oas.models.media.StringSchema; import io.swagger.v3.oas.models.media.StringSchema;
import org.openapitools.codegen.*; import org.openapitools.codegen.CodegenConstants;
import org.openapitools.codegen.CodegenOperation;
import org.openapitools.codegen.TestUtils;
import org.openapitools.codegen.languages.PythonClientCodegen; import org.openapitools.codegen.languages.PythonClientCodegen;
import org.openapitools.codegen.utils.ModelUtils;
import org.testng.Assert; import org.testng.Assert;
import org.testng.annotations.Test; import org.testng.annotations.Test;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.HashSet;
public class PythonClientCodegenTest { public class PythonClientCodegenTest {
@ -94,99 +93,12 @@ public class PythonClientCodegenTest {
Assert.assertEquals(op.allParams.get(5).pattern, "/^pattern\\d{3}$/i"); Assert.assertEquals(op.allParams.get(5).pattern, "/^pattern\\d{3}$/i");
} }
@Test(description = "test default value with single quotes") @Test(description = "test single quotes escape")
public void testSingleQuotesDefaultValue() { public void testSingleQuotes() {
final PythonClientCodegen codegen = new PythonClientCodegen(); final PythonClientCodegen codegen = new PythonClientCodegen();
StringSchema schema = new StringSchema(); StringSchema schema = new StringSchema();
schema.setDefault("Text containing 'single' quote"); schema.setDefault("Text containing 'single' quote");
String defaultValue = codegen.toDefaultValue(schema); String defaultValue = codegen.toDefaultValue(schema);
Assert.assertEquals(defaultValue, "\"Text containing 'single' quote\""); Assert.assertEquals("'Text containing \'single\' quote'", defaultValue);
}
@Test(description = "test example value with single quotes")
public void testSingleQuotesExampleValue() {
final PythonClientCodegen codegen = new PythonClientCodegen();
StringSchema schema = new StringSchema();
schema.setExample("Text containing 'single' quote");
String exampleValue = codegen.toExampleValue(schema);
Assert.assertEquals(exampleValue, "\"Text containing 'single' quote\"");
}
@Test
public void testFormParameterHasDefaultValue() {
final OpenAPI openAPI = TestUtils.parseFlattenSpec("src/test/resources/2_0/petstore-with-fake-endpoints-models-for-testing.yaml");
final PythonClientCodegen codegen = new PythonClientCodegen();
codegen.setOpenAPI(openAPI);
Schema requestBodySchema = ModelUtils.getSchemaFromRequestBody(openAPI.getPaths().get("/fake").getGet().getRequestBody());
CodegenParameter codegenParameter = codegen.fromFormProperty("enum_form_string", (Schema) requestBodySchema.getProperties().get("enum_form_string"), new HashSet<String>());
Assert.assertEquals(codegenParameter.defaultValue, "-efg");
}
@Test
public void testExample1() {
final OpenAPI openAPI = TestUtils.parseFlattenSpec("src/test/resources/3_0/examples.yaml");
final PythonClientCodegen codegen = new PythonClientCodegen();
Operation operation = openAPI.getPaths().get("/example1/singular").getGet();
CodegenParameter codegenParameter = CodegenModelFactory.newInstance(CodegenModelType.PARAMETER);
codegen.setParameterExampleValue(codegenParameter, operation.getParameters().get(0));
Assert.assertEquals(codegenParameter.example, "example1 value");
Operation operation2 = openAPI.getPaths().get("/example1/plural").getGet();
CodegenParameter codegenParameter2 = CodegenModelFactory.newInstance(CodegenModelType.PARAMETER);
codegen.setParameterExampleValue(codegenParameter2, operation2.getParameters().get(0));
Assert.assertEquals(codegenParameter2.example, "An example1 value");
}
@Test
public void testExample2() {
final OpenAPI openAPI = TestUtils.parseFlattenSpec("src/test/resources/3_0/examples.yaml");
final PythonClientCodegen codegen = new PythonClientCodegen();
Operation operation = openAPI.getPaths().get("/example2/singular").getGet();
CodegenParameter codegenParameter = CodegenModelFactory.newInstance(CodegenModelType.PARAMETER);
codegen.setParameterExampleValue(codegenParameter, operation.getParameters().get(0));
Assert.assertEquals(codegenParameter.example, "example2 value");
}
@Test
public void testExample3() {
final OpenAPI openAPI = TestUtils.parseFlattenSpec("src/test/resources/3_0/examples.yaml");
final PythonClientCodegen codegen = new PythonClientCodegen();
Operation operation = openAPI.getPaths().get("/example3/singular").getGet();
CodegenParameter codegenParameter = CodegenModelFactory.newInstance(CodegenModelType.PARAMETER);
codegen.setParameterExampleValue(codegenParameter, operation.getParameters().get(0));
Assert.assertEquals(codegenParameter.example, "example3: parameter value");
Operation operation2 = openAPI.getPaths().get("/example3/plural").getGet();
CodegenParameter codegenParameter2 = CodegenModelFactory.newInstance(CodegenModelType.PARAMETER);
codegen.setParameterExampleValue(codegenParameter2, operation2.getParameters().get(0));
Assert.assertEquals(codegenParameter2.example, "example3: parameter value");
}
@Test
public void testExample4() {
final OpenAPI openAPI = TestUtils.parseFlattenSpec("src/test/resources/3_0/examples.yaml");
final PythonClientCodegen codegen = new PythonClientCodegen();
Operation operation = openAPI.getPaths().get("/example4/singular").getPost();
CodegenParameter codegenParameter = CodegenModelFactory.newInstance(CodegenModelType.PARAMETER);
codegen.setParameterExampleValue(codegenParameter, operation.getRequestBody());
Assert.assertEquals(codegenParameter.example, "example4 value");
Operation operation2 = openAPI.getPaths().get("/example4/plural").getPost();
CodegenParameter codegenParameter2 = CodegenModelFactory.newInstance(CodegenModelType.PARAMETER);
codegen.setParameterExampleValue(codegenParameter2, operation2.getRequestBody());
Assert.assertEquals(codegenParameter2.example, "An example4 value");
} }
} }