From 867d47dd6d6ae744479af47c9f18fa4a3a22eb5b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=85smund=20Grammeltvedt?= Date: Tue, 28 Apr 2020 21:39:11 +0200 Subject: [PATCH 1/2] Propagate deprecated property through $ref's As $ref is supposed to completely replace the definition of a property, make sure we also include the 'deprecated' property when generating the type of a $ref property. This makes a property $ref'ing a deprecated schema also become deprecated. --- .../openapitools/codegen/DefaultCodegen.java | 8 +++++ .../codegen/DefaultCodegenTest.java | 13 +++++++ .../test/resources/3_0/model-deprecated.yaml | 36 +++++++++++++++++++ 3 files changed, 57 insertions(+) create mode 100644 modules/openapi-generator/src/test/resources/3_0/model-deprecated.yaml diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java index d4cc25414375..d1ca819778af 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java @@ -2844,6 +2844,14 @@ public CodegenProperty fromProperty(String name, Schema p) { if (p.getDeprecated() != null) { property.deprecated = p.getDeprecated(); + } else if (p.get$ref() != null) { + String ref = ModelUtils.getSimpleRef(p.get$ref()); + if (ref != null) { + Schema referencedSchema = ModelUtils.getSchemas(this.openAPI).get(ref); + if (referencedSchema != null && referencedSchema.getDeprecated() != null) { + property.deprecated = referencedSchema.getDeprecated(); + } + } } if (p.getReadOnly() != null) { property.isReadOnly = p.getReadOnly(); 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 bebe90010f73..45b7c5298164 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 @@ -1409,6 +1409,19 @@ public void testDeprecatedProperty() { Assert.assertFalse(codegen.fromProperty("customerCode",(Schema) requestProperties.get("customerCode")).deprecated); } + @Test + public void testDeprecatedRef() { + final OpenAPI openAPI = TestUtils.parseSpec("src/test/resources/3_0/model-deprecated.yaml"); + new InlineModelResolver().flatten(openAPI); + final DefaultCodegen codegen = new DefaultCodegen(); + codegen.setOpenAPI(openAPI); + + final Map requestProperties = Collections.unmodifiableMap(openAPI.getComponents().getSchemas().get("complex").getProperties()); + + Assert.assertTrue(codegen.fromProperty("deprecated", (Schema)requestProperties.get("deprecated")).deprecated); + Assert.assertFalse(codegen.fromProperty("current", (Schema)requestProperties.get("current")).deprecated); + } + @Test public void integerSchemaPropertyAndModelTest() { OpenAPI openAPI = TestUtils.createOpenAPI(); diff --git a/modules/openapi-generator/src/test/resources/3_0/model-deprecated.yaml b/modules/openapi-generator/src/test/resources/3_0/model-deprecated.yaml new file mode 100644 index 000000000000..a3388a8d695c --- /dev/null +++ b/modules/openapi-generator/src/test/resources/3_0/model-deprecated.yaml @@ -0,0 +1,36 @@ +openapi: 3.0.1 +info: + version: 1.0.0 + title: Example + license: + name: MIT +servers: + - url: http://api.example.xyz/v1 + +components: + schemas: + deprecated: + type: object + deprecated: true + properties: + customerCode: + type: string + example: '0001' + firstName: + type: string + example: 'first' + current: + type: object + properties: + customerCode: + type: string + example: '0001' + firstName: + type: string + example: 'first' + complex: + properties: + deprecated: + $ref: "#/components/schemas/deprecated" + current: + type: boolean From 6e716f49053b17485c97f9589f7d93232b36f23f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=85smund=20Grammeltvedt?= Date: Wed, 29 Apr 2020 13:39:06 +0200 Subject: [PATCH 2/2] Clarify why we're messing around with $ref --- .../src/main/java/org/openapitools/codegen/DefaultCodegen.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java index d1ca819778af..cc1aecbecc12 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java @@ -2845,6 +2845,9 @@ public CodegenProperty fromProperty(String name, Schema p) { if (p.getDeprecated() != null) { property.deprecated = p.getDeprecated(); } else if (p.get$ref() != null) { + // Since $ref should be replaced with the model it refers + // to, $ref'ing a model with 'deprecated' set should cause + // the property to reflect the model's 'deprecated' value. String ref = ModelUtils.getSimpleRef(p.get$ref()); if (ref != null) { Schema referencedSchema = ModelUtils.getSchemas(this.openAPI).get(ref);