From da67404f95bc4182a77d54dfd324ea3846780110 Mon Sep 17 00:00:00 2001 From: Chase Coalwell <782571+srchase@users.noreply.github.com> Date: Wed, 2 Aug 2023 11:29:08 -0700 Subject: [PATCH] Allow disabling format on integers (#1904) --- .../guides/converting-to-openapi.rst | 42 +++++++++++++++++++ .../openapi/AddDefaultConfigSettings.java | 7 +++- .../amazon/smithy/openapi/OpenApiConfig.java | 15 +++++++ .../fromsmithy/OpenApiJsonSchemaMapper.java | 3 +- .../OpenApiJsonSchemaMapperTest.java | 23 ++++++++++ 5 files changed, 88 insertions(+), 2 deletions(-) diff --git a/docs/source-2.0/guides/converting-to-openapi.rst b/docs/source-2.0/guides/converting-to-openapi.rst index 4aa49b96842..842cdb4e1be 100644 --- a/docs/source-2.0/guides/converting-to-openapi.rst +++ b/docs/source-2.0/guides/converting-to-openapi.rst @@ -536,6 +536,48 @@ useIntegerType (``boolean``) } } + +.. _generate-openapi-setting-disableIntegerFormat: + +disableIntegerFormat (``boolean``) + Set to true to disable setting the ``format`` property when using the + "integer" type that is enabled by the :ref:`useIntegerType ` + configuration setting. + + .. code-block:: json + + { + "version": "2.0", + "plugins": { + "openapi": { + "service": "example.weather#Weather", + "useIntegerType": true, + "disableIntegerFormat": true + } + } + } + + With this enabled (the default), the ``format`` property is set to ``int32`` + or ``int64`` for Integer or Long shapes respectively. + + .. code-block:: json + + { + "Foo": { + "type": "object", + "properties": { + "myInteger": { + "type": "integer", + "format": "int32" + }, + "myLong": { + "type": "integer", + "format": "int64" + } + } + } + } + .. _generate-openapi-setting-onErrorStatusConflict: onErrorStatusConflict (``String``) diff --git a/smithy-aws-apigateway-openapi/src/main/java/software/amazon/smithy/aws/apigateway/openapi/AddDefaultConfigSettings.java b/smithy-aws-apigateway-openapi/src/main/java/software/amazon/smithy/aws/apigateway/openapi/AddDefaultConfigSettings.java index 4c95190b539..07e4d34b2d2 100644 --- a/smithy-aws-apigateway-openapi/src/main/java/software/amazon/smithy/aws/apigateway/openapi/AddDefaultConfigSettings.java +++ b/smithy-aws-apigateway-openapi/src/main/java/software/amazon/smithy/aws/apigateway/openapi/AddDefaultConfigSettings.java @@ -23,7 +23,8 @@ * Disables OpenAPI and JSON Schema features not supported by API Gateway. * *

API Gateway does not allow characters like "_". API Gateway - * doesn't support the "default" trait. + * doesn't support the "default" trait or `int32` or `int64` "format" + * values. */ final class AddDefaultConfigSettings implements ApiGatewayMapper { @Override @@ -36,5 +37,9 @@ public void updateDefaultSettings(Model model, OpenApiConfig config) { config.setAlphanumericOnlyRefs(true); config.getDisableFeatures().add("default"); config.setDisableDefaultValues(true); + // If the `useIntegerType` config has been set, this assures that + // `int32` and `int64` formats are not set on those integer types. + // See https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-known-issues.html + config.setDisableIntegerFormat(true); } } diff --git a/smithy-openapi/src/main/java/software/amazon/smithy/openapi/OpenApiConfig.java b/smithy-openapi/src/main/java/software/amazon/smithy/openapi/OpenApiConfig.java index c2be5c1962e..43f6ea6b420 100644 --- a/smithy-openapi/src/main/java/software/amazon/smithy/openapi/OpenApiConfig.java +++ b/smithy-openapi/src/main/java/software/amazon/smithy/openapi/OpenApiConfig.java @@ -83,6 +83,7 @@ public enum HttpPrefixHeadersStrategy { private Map jsonAdd = Collections.emptyMap(); private List externalDocs = ListUtils.of( "Homepage", "API Reference", "User Guide", "Developer Guide", "Reference", "Guide"); + private boolean disableIntegerFormat = false; private OpenApiVersion version = OpenApiVersion.VERSION_3_0_2; public OpenApiConfig() { @@ -321,6 +322,20 @@ public void setVersion(OpenApiVersion version) { super.setJsonSchemaVersion(version.getJsonSchemaVersion()); } + + public boolean getDisableIntegerFormat() { + return this.disableIntegerFormat; + } + + /** + * Set to true to disable setting the `format` property on integer types. + * + * @param disableIntegerFormat True to disable setting format on integer types. + */ + public void setDisableIntegerFormat(boolean disableIntegerFormat) { + this.disableIntegerFormat = disableIntegerFormat; + } + /** * Creates an OpenApiConfig from a Node value. * diff --git a/smithy-openapi/src/main/java/software/amazon/smithy/openapi/fromsmithy/OpenApiJsonSchemaMapper.java b/smithy-openapi/src/main/java/software/amazon/smithy/openapi/fromsmithy/OpenApiJsonSchemaMapper.java index d6b325cfcf4..3d83c167e04 100644 --- a/smithy-openapi/src/main/java/software/amazon/smithy/openapi/fromsmithy/OpenApiJsonSchemaMapper.java +++ b/smithy-openapi/src/main/java/software/amazon/smithy/openapi/fromsmithy/OpenApiJsonSchemaMapper.java @@ -64,7 +64,8 @@ public Schema.Builder updateSchema(Shape shape, Schema.Builder builder, JsonSche } boolean useOpenApiIntegerType = config instanceof OpenApiConfig - && ((OpenApiConfig) config).getUseIntegerType(); + && ((OpenApiConfig) config).getUseIntegerType() + && !((OpenApiConfig) config).getDisableIntegerFormat(); // Don't overwrite an existing format setting. if (!builder.getFormat().isPresent()) { 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 6e7558965b1..a199f3609b6 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 @@ -180,6 +180,29 @@ public void supportsInt64() { assertThat(document.getRootSchema().getFormat().get(), equalTo("int64")); } + @Test + public void canDisableIntegerFormats() { + IntegerShape integerShape = IntegerShape.builder().id("a.b#C").build(); + LongShape longShape = LongShape.builder().id("a.b#D").build(); + Model model = Model.builder().addShapes(integerShape, longShape).build(); + OpenApiConfig config = new OpenApiConfig(); + config.setUseIntegerType(true); + config.setDisableIntegerFormat(true); + JsonSchemaConverter converter = JsonSchemaConverter.builder() + .addMapper(new OpenApiJsonSchemaMapper()) + .config(config) + .model(model) + .build(); + + SchemaDocument integerDocument = converter.convertShape(integerShape); + SchemaDocument longDocument = converter.convertShape(longShape); + + assertThat(integerDocument.getRootSchema().getFormat().isPresent(), equalTo(false)); + assertThat(integerDocument.getRootSchema().getType().get(), equalTo("integer")); + assertThat(longDocument.getRootSchema().getFormat().isPresent(), equalTo(false)); + assertThat(longDocument.getRootSchema().getType().get(), equalTo("integer")); + } + @Test public void supportsFloatFormat() { FloatShape shape = FloatShape.builder().id("a.b#C").build();