diff --git a/smithy-jsonschema/src/main/java/software/amazon/smithy/jsonschema/JsonSchemaConfig.java b/smithy-jsonschema/src/main/java/software/amazon/smithy/jsonschema/JsonSchemaConfig.java index db2d5cee379..4095fe4b20c 100644 --- a/smithy-jsonschema/src/main/java/software/amazon/smithy/jsonschema/JsonSchemaConfig.java +++ b/smithy-jsonschema/src/main/java/software/amazon/smithy/jsonschema/JsonSchemaConfig.java @@ -136,6 +136,7 @@ public String toString() { private boolean disableIntEnums = false; private boolean addReferenceDescriptions = false; private boolean useInlineMaps = false; + private boolean disableDefaultDeprecatedMessage = false; public JsonSchemaConfig() { nodeMapper.setWhenMissingSetter(NodeMapper.WhenMissing.IGNORE); @@ -467,6 +468,24 @@ public void setDisableIntEnums(boolean disableIntEnums) { this.disableIntEnums = disableIntEnums; } + public boolean getDisableDefaultDeprecatedMessage() { + return disableDefaultDeprecatedMessage; + } + + /** + * Set to true to disable adding default deprecated messages to schema descriptions + * when the @deprecated trait is present but has no message or since. + * + *

By default, when a shape has the @deprecated trait, a default message like + * "This operation is deprecated." is added to the schema description. Setting this + * to true will prevent the default description from being added. + * + * @param disableDefaultDeprecatedMessage True to disable default description for @deprecated trait. + */ + public void setDisableDefaultDeprecatedMessage(boolean disableDefaultDeprecatedMessage) { + this.disableDefaultDeprecatedMessage = disableDefaultDeprecatedMessage; + } + /** * JSON schema version to use when converting Smithy shapes into Json Schema. * diff --git a/smithy-jsonschema/src/main/java/software/amazon/smithy/jsonschema/JsonSchemaShapeVisitor.java b/smithy-jsonschema/src/main/java/software/amazon/smithy/jsonschema/JsonSchemaShapeVisitor.java index 5b590cf9be2..070a5b4f293 100644 --- a/smithy-jsonschema/src/main/java/software/amazon/smithy/jsonschema/JsonSchemaShapeVisitor.java +++ b/smithy-jsonschema/src/main/java/software/amazon/smithy/jsonschema/JsonSchemaShapeVisitor.java @@ -381,11 +381,21 @@ private Optional descriptionMessage(Shape shape) { shape .getTrait(DocumentationTrait.class) .ifPresent(trait -> builder.append(trait.getValue())); + + JsonSchemaConfig config = converter.getConfig(); + boolean disableDefaultDeprecatedMessage = config.getDisableDefaultDeprecatedMessage(); + shape .getTrait(DeprecatedTrait.class) - .ifPresent(trait -> builder - .append("\n") - .append(trait.getDeprecatedDescription(shape.getType()))); + .ifPresent(trait -> { + if (!disableDefaultDeprecatedMessage || trait.getMessage().isPresent() + || trait.getSince().isPresent()) { + builder + .append("\n") + .append(trait.getDeprecatedDescription(shape.getType())); + } + }); + String description = builder.toString().trim(); return description.isEmpty() ? Optional.empty() : Optional.of(description); } diff --git a/smithy-openapi/src/test/java/software/amazon/smithy/openapi/fromsmithy/OpenApiJsonSchemaMapperTest.java b/smithy-openapi/src/test/java/software/amazon/smithy/openapi/fromsmithy/OpenApiJsonSchemaMapperTest.java index d618ff8775e..41fa01e14fc 100644 --- a/smithy-openapi/src/test/java/software/amazon/smithy/openapi/fromsmithy/OpenApiJsonSchemaMapperTest.java +++ b/smithy-openapi/src/test/java/software/amazon/smithy/openapi/fromsmithy/OpenApiJsonSchemaMapperTest.java @@ -139,6 +139,95 @@ public void appendsDeprecatedInfoInDescription() { assertThat(document.getRootSchema().getDescription().get(), equalTo(expected)); } + @Test + public void disableDefaultDeprecatedMessage() { + IntegerShape shape = IntegerShape.builder() + .id("a.b#C") + .addTrait(DeprecatedTrait.builder().build()) + .addTrait(new DocumentationTrait("This is an integer.")) + .build(); + Model model = Model.builder().addShape(shape).build(); + JsonSchemaConfig config = new JsonSchemaConfig(); + config.setDisableDefaultDeprecatedMessage(true); + SchemaDocument document = JsonSchemaConverter.builder() + .addMapper(new OpenApiJsonSchemaMapper()) + .model(model) + .config(config) + .build() + .convertShape(shape); + + String expected = "This is an integer."; + assertThat(document.getRootSchema().getDescription().get(), equalTo(expected)); + + // Asserts that deprecated node is still there + assertThat(document.getRootSchema().getExtension("deprecated").get(), equalTo(Node.from(true))); + } + + @Test + public void disableDefaultDeprecatedMessageStillAllowsCustomMessage() { + String message = "Use a.b#D instead."; + IntegerShape shape = IntegerShape.builder() + .id("a.b#C") + .addTrait(DeprecatedTrait.builder().message(message).build()) + .addTrait(new DocumentationTrait("This is an integer.")) + .build(); + Model model = Model.builder().addShape(shape).build(); + JsonSchemaConfig config = new JsonSchemaConfig(); + config.setDisableDefaultDeprecatedMessage(true); + SchemaDocument document = JsonSchemaConverter.builder() + .addMapper(new OpenApiJsonSchemaMapper()) + .model(model) + .config(config) + .build() + .convertShape(shape); + + String expected = "This is an integer.\nThis shape is deprecated: Use a.b#D instead."; + assertThat(document.getRootSchema().getDescription().get(), equalTo(expected)); + } + + @Test + public void disableDefaultDeprecatedMessageStillAllowsSince() { + String since = "2020-01-01"; + IntegerShape shape = IntegerShape.builder() + .id("a.b#C") + .addTrait(DeprecatedTrait.builder().since(since).build()) + .addTrait(new DocumentationTrait("This is an integer.")) + .build(); + Model model = Model.builder().addShape(shape).build(); + JsonSchemaConfig config = new JsonSchemaConfig(); + config.setDisableDefaultDeprecatedMessage(true); + SchemaDocument document = JsonSchemaConverter.builder() + .addMapper(new OpenApiJsonSchemaMapper()) + .model(model) + .config(config) + .build() + .convertShape(shape); + + String expected = "This is an integer.\nThis shape is deprecated since 2020-01-01."; + assertThat(document.getRootSchema().getDescription().get(), equalTo(expected)); + } + + @Test + public void disableDefaultDeprecatedMessageOnlyAffectsIfTrue() { + IntegerShape shape = IntegerShape.builder() + .id("a.b#C") + .addTrait(DeprecatedTrait.builder().build()) + .addTrait(new DocumentationTrait("This is an integer.")) + .build(); + Model model = Model.builder().addShape(shape).build(); + JsonSchemaConfig config = new JsonSchemaConfig(); + config.setDisableDefaultDeprecatedMessage(false); + SchemaDocument document = JsonSchemaConverter.builder() + .addMapper(new OpenApiJsonSchemaMapper()) + .model(model) + .config(config) + .build() + .convertShape(shape); + + String expected = "This is an integer.\nThis shape is deprecated."; + assertThat(document.getRootSchema().getDescription().get(), equalTo(expected)); + } + @Test public void supportsInt32() { IntegerShape shape = IntegerShape.builder().id("a.b#C").build();