diff --git a/docs/customization.md b/docs/customization.md index 5376b621e6cb..c63f71472ce0 100644 --- a/docs/customization.md +++ b/docs/customization.md @@ -477,3 +477,10 @@ Example: ``` java -jar modules/openapi-generator-cli/target/openapi-generator-cli.jar generate -g java -i modules/openapi-generator/src/test/resources/3_0/simplifyAnyOfStringAndEnumString_test.yaml -o /tmp/java-okhttp/ --openapi-normalizer SIMPLIFY_ANYOF_STRING_AND_ENUM_STRING=true ``` + +- `SIMPLIFY_BOOLEAN_ENUM`: when set to `true`, convert boolean enum to just enum. + +Example: +``` +java -jar modules/openapi-generator-cli/target/openapi-generator-cli.jar generate -g java -i modules/openapi-generator/src/test/resources/3_0/simplifyBooleanEnum_test.yaml -o /tmp/java-okhttp/ --openapi-normalizer SIMPLIFY_BOOLEAN_ENUM=true +``` diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/OpenAPINormalizer.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/OpenAPINormalizer.java index b4ec2e1ea03c..639e1bdac2d9 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/OpenAPINormalizer.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/OpenAPINormalizer.java @@ -63,6 +63,10 @@ public class OpenAPINormalizer { final String SIMPLIFY_ANYOF_STRING_AND_ENUM_STRING = "SIMPLIFY_ANYOF_STRING_AND_ENUM_STRING"; boolean simplifyAnyOfStringAndEnumString; + // when set to true, boolean enum will be converted to just boolean + final String SIMPLIFY_BOOLEAN_ENUM = "SIMPLIFY_BOOLEAN_ENUM"; + boolean simplifyBooleanEnum; + // ============= end of rules ============= /** @@ -106,6 +110,10 @@ public void parseRules(Map rules) { if (enableAll || "true".equalsIgnoreCase(rules.get(SIMPLIFY_ANYOF_STRING_AND_ENUM_STRING))) { simplifyAnyOfStringAndEnumString = true; } + + if (enableAll || "true".equalsIgnoreCase(rules.get(SIMPLIFY_BOOLEAN_ENUM))) { + simplifyBooleanEnum = true; + } } /** @@ -301,11 +309,11 @@ public Schema normalizeSchema(Schema schema, Set visitedSchemas) { visitedSchemas.add(schema); } - if (schema instanceof ArraySchema) { + if (schema instanceof ArraySchema) { // array normalizeSchema(schema.getItems(), visitedSchemas); } else if (schema.getAdditionalProperties() instanceof Schema) { // map normalizeSchema((Schema) schema.getAdditionalProperties(), visitedSchemas); - } else if (ModelUtils.isComposedSchema(schema)) { + } else if (ModelUtils.isComposedSchema(schema)) { // composed schema ComposedSchema cs = (ComposedSchema) schema; if (ModelUtils.isComplexComposedSchema(cs)) { @@ -337,6 +345,8 @@ public Schema normalizeSchema(Schema schema, Set visitedSchemas) { normalizeSchema(schema.getNot(), visitedSchemas); } else if (schema.getProperties() != null && !schema.getProperties().isEmpty()) { normalizeProperties(schema.getProperties(), visitedSchemas); + } else if (schema instanceof BooleanSchema) { + normalizeBooleanSchema(schema, visitedSchemas); } else if (schema instanceof Schema) { normalizeSchemaWithOnlyProperties(schema, visitedSchemas); } else { @@ -346,6 +356,10 @@ public Schema normalizeSchema(Schema schema, Set visitedSchemas) { return schema; } + private void normalizeBooleanSchema(Schema schema, Set visitedSchemas) { + processSimplifyBooleanEnum(schema); + } + private void normalizeSchemaWithOnlyProperties(Schema schema, Set visitedSchemas) { // normalize non-composed schema (e.g. schema with only properties) } @@ -476,7 +490,6 @@ private void processKeepOnlyFirstTagInOperation(Operation operation) { * @param schema Schema */ private void processRemoveAnyOfOneOfAndKeepPropertiesOnly(Schema schema) { - if (!removeAnyOfOneOfAndKeepPropertiesOnly && !enableAll) { return; } @@ -528,5 +541,25 @@ private Schema processSimplifyAnyOfStringAndEnumString(Schema schema) { } } + /** + * If the schema is boolean and its enum is defined, + * then simply it to just boolean. + * + * @param schema Schema + * @return Schema + */ + private void processSimplifyBooleanEnum(Schema schema) { + if (!simplifyBooleanEnum && !enableAll) { + return; + } + + if (schema instanceof BooleanSchema) { + BooleanSchema bs = (BooleanSchema) schema; + if (bs.getEnum() != null && !bs.getEnum().isEmpty()) { // enum defined + bs.setEnum(null); + } + } + } + // ===================== end of rules ===================== } diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/DefaultCodegenTest.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/DefaultCodegenTest.java index 0414e03457b4..103c8a05cb71 100644 --- a/modules/openapi-generator/src/test/java/org/openapitools/codegen/DefaultCodegenTest.java +++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/DefaultCodegenTest.java @@ -4394,4 +4394,27 @@ public void testOpenAPINormalizerSimplifyOneOfAnyOfStringAndEnumString() { assertNull(schema3.getAnyOf()); assertTrue(schema3 instanceof StringSchema); } + + @Test + public void testOpenAPINormalizerSimplifyBooleanEnum() { + // to test the rule SIMPLIFY_BOOLEAN_ENUM + OpenAPI openAPI = TestUtils.parseSpec("src/test/resources/3_0/simplifyBooleanEnum_test.yaml"); + + Schema schema = openAPI.getComponents().getSchemas().get("BooleanEnumTest"); + assertEquals(schema.getProperties().size(), 3); + assertTrue(schema.getProperties().get("boolean_enum") instanceof BooleanSchema); + BooleanSchema bs = (BooleanSchema) schema.getProperties().get("boolean_enum"); + assertEquals(bs.getEnum().size(), 2); + + Map options = new HashMap<>(); + options.put("SIMPLIFY_BOOLEAN_ENUM", "true"); + OpenAPINormalizer openAPINormalizer = new OpenAPINormalizer(openAPI, options); + openAPINormalizer.normalize(); + + Schema schema3 = openAPI.getComponents().getSchemas().get("BooleanEnumTest"); + assertEquals(schema.getProperties().size(), 3); + assertTrue(schema.getProperties().get("boolean_enum") instanceof BooleanSchema); + BooleanSchema bs2 = (BooleanSchema) schema.getProperties().get("boolean_enum"); + assertNull(bs2.getEnum()); //ensure the enum has been erased + } } diff --git a/modules/openapi-generator/src/test/resources/3_0/simplifyBooleanEnum_test.yaml b/modules/openapi-generator/src/test/resources/3_0/simplifyBooleanEnum_test.yaml new file mode 100644 index 000000000000..270dfcea6415 --- /dev/null +++ b/modules/openapi-generator/src/test/resources/3_0/simplifyBooleanEnum_test.yaml @@ -0,0 +1,43 @@ +openapi: 3.0.1 +info: + version: 1.0.0 + title: Example + license: + name: MIT +servers: + - url: http://api.example.xyz/v1 +paths: + /person/display/{personId}: + get: + parameters: + - name: personId + in: path + required: true + description: The id of the person to retrieve + schema: + type: string + operationId: list + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: "#/components/schemas/BooleanEnumTest" +components: + schemas: + BooleanEnumTest: + description: a model to with boolean enum property + type: object + properties: + id: + type: integer + format: int64 + name: + type: string + pattern: '^[a-zA-Z0-9]+[a-zA-Z0-9\.\-_]*[a-zA-Z0-9]+$' + boolean_enum: + type: boolean + enum: + - true + - false