From d1d0568467ae8a24cbb1463c094ae6b6204bba8e Mon Sep 17 00:00:00 2001 From: Justin Black Date: Mon, 4 Dec 2023 01:23:46 -0800 Subject: [PATCH 01/15] Adjusts storage of max/min/exclMax/Min --- .../codegen/common/ModelUtils.java | 36 +++++-------------- .../openapimodels/CodegenSchema.java | 9 ++--- 2 files changed, 13 insertions(+), 32 deletions(-) diff --git a/src/main/java/org/openapijsonschematools/codegen/common/ModelUtils.java b/src/main/java/org/openapijsonschematools/codegen/common/ModelUtils.java index fd96f2dd2ee..668282636d4 100644 --- a/src/main/java/org/openapijsonschematools/codegen/common/ModelUtils.java +++ b/src/main/java/org/openapijsonschematools/codegen/common/ModelUtils.java @@ -1503,16 +1503,8 @@ public static void syncValidationProperties(Schema schema, CodegenSchema target) BigDecimal multipleOf = schema.getMultipleOf(); BigDecimal minimum = schema.getMinimum(); BigDecimal maximum = schema.getMaximum(); - Boolean exclusiveMinimum = schema.getExclusiveMinimum(); - if (minimum == null && schema.getExclusiveMinimumValue() != null) { - minimum = schema.getExclusiveMinimumValue(); - exclusiveMinimum = Boolean.TRUE; - } - Boolean exclusiveMaximum = schema.getExclusiveMaximum(); - if (maximum == null && schema.getExclusiveMaximumValue() != null) { - maximum = schema.getExclusiveMaximumValue(); - exclusiveMaximum = Boolean.TRUE; - } + BigDecimal exclusiveMinimum = schema.getExclusiveMinimumValue(); + BigDecimal exclusiveMaximum = schema.getExclusiveMaximumValue(); if (isArraySchema(schema)) { setArrayValidations(minItems, maxItems, uniqueItems, target); @@ -1551,24 +1543,12 @@ private static void setStringValidations(Integer minLength, Integer maxLength, S if (maxLength != null) target.maxLength = maxLength; } - private static void setNumericValidations(Schema schema, BigDecimal multipleOf, BigDecimal minimum, BigDecimal maximum, Boolean exclusiveMinimum, Boolean exclusiveMaximum, CodegenSchema target) { - if (multipleOf != null) target.multipleOf = multipleOf; - if (minimum != null) { - if (isIntegerSchema(schema)) { - target.minimum = String.valueOf(minimum.longValue()); - } else { - target.minimum = String.valueOf(minimum); - } - if (exclusiveMinimum != null) target.exclusiveMinimum = exclusiveMinimum; - } - if (maximum != null) { - if (isIntegerSchema(schema)) { - target.maximum = String.valueOf(maximum.longValue()); - } else { - target.maximum = String.valueOf(maximum); - } - if (exclusiveMaximum != null) target.exclusiveMaximum = exclusiveMaximum; - } + private static void setNumericValidations(Schema schema, BigDecimal multipleOf, BigDecimal minimum, BigDecimal maximum, BigDecimal exclusiveMinimum, BigDecimal exclusiveMaximum, CodegenSchema target) { + target.multipleOf = multipleOf; + target.minimum = minimum; + target.maximum = maximum; + target.exclusiveMinimum = exclusiveMinimum; + target.exclusiveMaximum = exclusiveMaximum; } private static ObjectMapper getRightMapper(String data) { diff --git a/src/main/java/org/openapijsonschematools/codegen/generators/openapimodels/CodegenSchema.java b/src/main/java/org/openapijsonschematools/codegen/generators/openapimodels/CodegenSchema.java index 802ffee0f35..b2cd116b7b5 100644 --- a/src/main/java/org/openapijsonschematools/codegen/generators/openapimodels/CodegenSchema.java +++ b/src/main/java/org/openapijsonschematools/codegen/generators/openapimodels/CodegenSchema.java @@ -19,6 +19,7 @@ import io.swagger.v3.oas.models.ExternalDocumentation; +import java.math.BigDecimal; import java.util.ArrayList; import java.util.HashMap; import java.util.LinkedHashMap; @@ -32,10 +33,10 @@ public class CodegenSchema { // 3.0.0 public String title; public Number multipleOf; - public String maximum; - public Boolean exclusiveMaximum; - public String minimum; - public Boolean exclusiveMinimum; + public BigDecimal maximum; + public BigDecimal exclusiveMaximum; + public BigDecimal minimum; + public BigDecimal exclusiveMinimum; public Integer maxLength; public Integer minLength; public CodegenPatternInfo patternInfo; From acc93e33a8d0321c6492e7b2f21caf326a15ed08 Mon Sep 17 00:00:00 2001 From: Justin Black Date: Mon, 4 Dec 2023 13:54:13 -0800 Subject: [PATCH 02/15] Fixes java tests --- .../generators/DefaultGeneratorTest.java | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/src/test/java/org/openapijsonschematools/codegen/generators/DefaultGeneratorTest.java b/src/test/java/org/openapijsonschematools/codegen/generators/DefaultGeneratorTest.java index ce5c96c1260..c0830a969ed 100644 --- a/src/test/java/org/openapijsonschematools/codegen/generators/DefaultGeneratorTest.java +++ b/src/test/java/org/openapijsonschematools/codegen/generators/DefaultGeneratorTest.java @@ -66,6 +66,7 @@ import org.testng.annotations.Ignore; import org.testng.annotations.Test; +import java.math.BigDecimal; import java.util.Arrays; import java.util.Collections; import java.util.HashMap; @@ -2069,7 +2070,7 @@ public void testItemsPresent() { "#/components/schemas/" + modelName, "#/components/schemas/" + modelName ); - assertEquals(cm.items.maximum, "7"); + assertEquals(cm.items.maximum, new BigDecimal(7)); modelName = "ObjectWithValidationsInArrayPropItems"; sc = openAPI.getComponents().getSchemas().get(modelName); @@ -2079,7 +2080,7 @@ public void testItemsPresent() { "#/components/schemas/" + modelName ); CodegenKey ck = codegen.getKey("arrayProp", "misc"); - assertEquals(cm.properties.get(ck).items.maximum, "7"); + assertEquals(cm.properties.get(ck).items.maximum, new BigDecimal(7)); String path; Operation operation; @@ -2088,17 +2089,17 @@ public void testItemsPresent() { path = "/ref_array_with_validations_in_items/{items}"; operation = openAPI.getPaths().get(path).getPost(); co = codegen.fromOperation(operation, getOperationPath(path, "post"), null); - assertEquals(co.parameters.pathParameters.get(0).schema.refInfo.ref.items.maximum, "7"); // disabled because refed + assertEquals(co.parameters.pathParameters.get(0).schema.refInfo.ref.items.maximum, new BigDecimal(7)); CodegenKey applicationJson = codegen.getKey("application/json", "misc"); - assertEquals(co.requestBody.content.get(applicationJson).schema.refInfo.ref.items.maximum, "7"); // disabled because refed - assertEquals(co.responses.get("200").content.get(applicationJson).schema.refInfo.ref.items.maximum, "7"); // disabled because refed + assertEquals(co.requestBody.content.get(applicationJson).schema.refInfo.ref.items.maximum, new BigDecimal(7)); + assertEquals(co.responses.get("200").content.get(applicationJson).schema.refInfo.ref.items.maximum, new BigDecimal(7)); path = "/array_with_validations_in_items/{items}"; operation = openAPI.getPaths().get(path).getPost(); co = codegen.fromOperation(operation, getOperationPath(path, "post"), null); - assertEquals(co.parameters.pathParameters.get(0).schema.items.maximum, "7"); - assertEquals(co.requestBody.content.get(applicationJson).schema.items.maximum, "7"); - assertEquals(co.responses.get("200").content.get(applicationJson).schema.items.maximum, "7"); + assertEquals(co.parameters.pathParameters.get(0).schema.items.maximum, new BigDecimal(7)); + assertEquals(co.requestBody.content.get(applicationJson).schema.items.maximum, new BigDecimal(7)); + assertEquals(co.responses.get("200").content.get(applicationJson).schema.items.maximum, new BigDecimal(7)); } @Test From c99f342d6b95c4814481c1db912a44ee3e0d0e4c Mon Sep 17 00:00:00 2001 From: Justin Black Date: Mon, 4 Dec 2023 13:59:44 -0800 Subject: [PATCH 03/15] Updates python templates --- .../codegen/generators/openapimodels/CodegenSchema.java | 4 ++-- .../components/schemas/schema_cls/_exclusive_maximum.hbs | 1 + .../components/schemas/schema_cls/_exclusive_minimum.hbs | 1 + .../python/components/schemas/schema_cls/_maximum.hbs | 2 +- .../python/components/schemas/schema_cls/_minimum.hbs | 2 +- .../python/components/schemas/schema_cls/_schema_number.hbs | 6 ++++++ 6 files changed, 12 insertions(+), 4 deletions(-) create mode 100644 src/main/resources/python/components/schemas/schema_cls/_exclusive_maximum.hbs create mode 100644 src/main/resources/python/components/schemas/schema_cls/_exclusive_minimum.hbs diff --git a/src/main/java/org/openapijsonschematools/codegen/generators/openapimodels/CodegenSchema.java b/src/main/java/org/openapijsonschematools/codegen/generators/openapimodels/CodegenSchema.java index b2cd116b7b5..e49b00a0a28 100644 --- a/src/main/java/org/openapijsonschematools/codegen/generators/openapimodels/CodegenSchema.java +++ b/src/main/java/org/openapijsonschematools/codegen/generators/openapimodels/CodegenSchema.java @@ -170,10 +170,10 @@ public List keywords() { if (minProperties != null) { keywords.add("minProperties"); } - if (maximum != null && exclusiveMaximum == null) { + if (maximum != null) { keywords.add("maximum"); } - if (minimum != null && exclusiveMinimum == null) { + if (minimum != null) { keywords.add("minimum"); } if (multipleOf != null) { diff --git a/src/main/resources/python/components/schemas/schema_cls/_exclusive_maximum.hbs b/src/main/resources/python/components/schemas/schema_cls/_exclusive_maximum.hbs new file mode 100644 index 00000000000..791275da1aa --- /dev/null +++ b/src/main/resources/python/components/schemas/schema_cls/_exclusive_maximum.hbs @@ -0,0 +1 @@ +exclusive_maximum: typing.Union[int, float] = {{exclusiveMaximum}} diff --git a/src/main/resources/python/components/schemas/schema_cls/_exclusive_minimum.hbs b/src/main/resources/python/components/schemas/schema_cls/_exclusive_minimum.hbs new file mode 100644 index 00000000000..f871cc86f52 --- /dev/null +++ b/src/main/resources/python/components/schemas/schema_cls/_exclusive_minimum.hbs @@ -0,0 +1 @@ +exclusive_minimum: typing.Union[int, float] = {{exclusiveMinimum}} diff --git a/src/main/resources/python/components/schemas/schema_cls/_maximum.hbs b/src/main/resources/python/components/schemas/schema_cls/_maximum.hbs index 92ce76989e9..5aa99575c49 100644 --- a/src/main/resources/python/components/schemas/schema_cls/_maximum.hbs +++ b/src/main/resources/python/components/schemas/schema_cls/_maximum.hbs @@ -1 +1 @@ -{{#if exclusiveMaximum}}exclusive_maximum{{else}}inclusive_maximum{{/if}}: typing.Union[int, float] = {{maximum}} +inclusive_maximum: typing.Union[int, float] = {{maximum}} diff --git a/src/main/resources/python/components/schemas/schema_cls/_minimum.hbs b/src/main/resources/python/components/schemas/schema_cls/_minimum.hbs index c510f0c4a65..73ec7295eec 100644 --- a/src/main/resources/python/components/schemas/schema_cls/_minimum.hbs +++ b/src/main/resources/python/components/schemas/schema_cls/_minimum.hbs @@ -1 +1 @@ -{{#if exclusiveMinimum}}exclusive_minimum{{else}}inclusive_minimum{{/if}}: typing.Union[int, float] = {{minimum}} +inclusive_minimum: typing.Union[int, float] = {{minimum}} diff --git a/src/main/resources/python/components/schemas/schema_cls/_schema_number.hbs b/src/main/resources/python/components/schemas/schema_cls/_schema_number.hbs index 22e25cc6913..331a46fb430 100644 --- a/src/main/resources/python/components/schemas/schema_cls/_schema_number.hbs +++ b/src/main/resources/python/components/schemas/schema_cls/_schema_number.hbs @@ -25,6 +25,12 @@ class {{jsonPathPiece.camelCase}}( {{#if minimum}} {{> components/schemas/schema_cls/_minimum }} {{/if}} +{{#if exclusiveMaximum}} + {{> components/schemas/schema_cls/_exclusive_maximum }} +{{/if}} +{{#if exclusiveMinimum}} + {{> components/schemas/schema_cls/_exclusive_minimum }} +{{/if}} {{#if multipleOf}} {{> components/schemas/schema_cls/_multiple_of }} {{/if}} From 8b84f56a4ee697c260ed4ae7fac7bb9b2cd129ac Mon Sep 17 00:00:00 2001 From: Justin Black Date: Mon, 4 Dec 2023 14:01:32 -0800 Subject: [PATCH 04/15] Fiexes anytype template schemas for python --- .../schemas/schema_cls/_schema_anytype_or_multitype.hbs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/main/resources/python/components/schemas/schema_cls/_schema_anytype_or_multitype.hbs b/src/main/resources/python/components/schemas/schema_cls/_schema_anytype_or_multitype.hbs index 4b4a6184c70..fb4a0e68990 100644 --- a/src/main/resources/python/components/schemas/schema_cls/_schema_anytype_or_multitype.hbs +++ b/src/main/resources/python/components/schemas/schema_cls/_schema_anytype_or_multitype.hbs @@ -81,6 +81,12 @@ class {{jsonPathPiece.camelCase}}( {{#if minimum}} {{> components/schemas/schema_cls/_minimum }} {{/if}} +{{#if exclusiveMaximum}} + {{> components/schemas/schema_cls/_exclusive_maximum }} +{{/if}} +{{#if exclusiveMinimum}} + {{> components/schemas/schema_cls/_exclusive_minimum }} +{{/if}} {{#if multipleOf}} {{> components/schemas/schema_cls/_multiple_of }} {{/if}} From 656b315ca94918c01d8d61c2ad5796f28b85cebb Mon Sep 17 00:00:00 2001 From: Justin Black Date: Mon, 4 Dec 2023 14:13:47 -0800 Subject: [PATCH 05/15] Move java fixes, add org.codehaus.janino back in --- pom.xml | 5 +++++ .../schema/exclusivemaximum_validation.py | 15 +-------------- .../schema/exclusiveminimum_validation.py | 15 +-------------- .../components/schema/if_and_else_without_then.py | 10 +--------- .../components/schema/if_and_then_without_else.py | 10 +--------- .../non_interference_across_combined_schemas.py | 10 +--------- ...alidate_against_correct_branch_then_vs_else.py | 10 +--------- .../generators/openapimodels/CodegenSchema.java | 6 +++--- .../components/schemas/schema_cls/schema_cls.hbs | 4 ++-- 9 files changed, 16 insertions(+), 69 deletions(-) diff --git a/pom.xml b/pom.xml index a65b03171ab..f45f6dbb385 100644 --- a/pom.xml +++ b/pom.xml @@ -438,6 +438,11 @@ logback-core ${logback.version} + + org.codehaus.janino + janino + 3.1.11 + diff --git a/samples/client/3_1_0_unit_test/python/src/unit_test_api/components/schema/exclusivemaximum_validation.py b/samples/client/3_1_0_unit_test/python/src/unit_test_api/components/schema/exclusivemaximum_validation.py index 3e27fb50171..e8decfe972e 100644 --- a/samples/client/3_1_0_unit_test/python/src/unit_test_api/components/schema/exclusivemaximum_validation.py +++ b/samples/client/3_1_0_unit_test/python/src/unit_test_api/components/schema/exclusivemaximum_validation.py @@ -10,17 +10,4 @@ from __future__ import annotations from unit_test_api.shared_imports.schema_imports import * # pyright: ignore [reportWildcardImportFromLibrary] - - -@dataclasses.dataclass(frozen=True) -class ExclusivemaximumValidation( - schemas.AnyTypeSchema[schemas.immutabledict[str, schemas.OUTPUT_BASE_TYPES], typing.Tuple[schemas.OUTPUT_BASE_TYPES, ...]], -): - """NOTE: This class is auto generated by OpenAPI JSON Schema Generator. - Ref: https://github.com/openapi-json-schema-tools/openapi-json-schema-generator - - Do not edit the class manually. - """ - # any type - exclusive_maximum: typing.Union[int, float] = 3.0 - +ExclusivemaximumValidation: typing_extensions.TypeAlias = schemas.AnyTypeSchema diff --git a/samples/client/3_1_0_unit_test/python/src/unit_test_api/components/schema/exclusiveminimum_validation.py b/samples/client/3_1_0_unit_test/python/src/unit_test_api/components/schema/exclusiveminimum_validation.py index 71fbf08c25c..2b6af520f56 100644 --- a/samples/client/3_1_0_unit_test/python/src/unit_test_api/components/schema/exclusiveminimum_validation.py +++ b/samples/client/3_1_0_unit_test/python/src/unit_test_api/components/schema/exclusiveminimum_validation.py @@ -10,17 +10,4 @@ from __future__ import annotations from unit_test_api.shared_imports.schema_imports import * # pyright: ignore [reportWildcardImportFromLibrary] - - -@dataclasses.dataclass(frozen=True) -class ExclusiveminimumValidation( - schemas.AnyTypeSchema[schemas.immutabledict[str, schemas.OUTPUT_BASE_TYPES], typing.Tuple[schemas.OUTPUT_BASE_TYPES, ...]], -): - """NOTE: This class is auto generated by OpenAPI JSON Schema Generator. - Ref: https://github.com/openapi-json-schema-tools/openapi-json-schema-generator - - Do not edit the class manually. - """ - # any type - exclusive_minimum: typing.Union[int, float] = 1.1 - +ExclusiveminimumValidation: typing_extensions.TypeAlias = schemas.AnyTypeSchema diff --git a/samples/client/3_1_0_unit_test/python/src/unit_test_api/components/schema/if_and_else_without_then.py b/samples/client/3_1_0_unit_test/python/src/unit_test_api/components/schema/if_and_else_without_then.py index 63f498c4997..20521b4e191 100644 --- a/samples/client/3_1_0_unit_test/python/src/unit_test_api/components/schema/if_and_else_without_then.py +++ b/samples/client/3_1_0_unit_test/python/src/unit_test_api/components/schema/if_and_else_without_then.py @@ -19,15 +19,7 @@ class _Else( # any type multiple_of: typing.Union[int, float] = 2 - - -@dataclasses.dataclass(frozen=True) -class _If( - schemas.AnyTypeSchema[schemas.immutabledict[str, schemas.OUTPUT_BASE_TYPES], typing.Tuple[schemas.OUTPUT_BASE_TYPES, ...]], -): - # any type - exclusive_maximum: typing.Union[int, float] = 0 - +_If: typing_extensions.TypeAlias = schemas.AnyTypeSchema @dataclasses.dataclass(frozen=True) diff --git a/samples/client/3_1_0_unit_test/python/src/unit_test_api/components/schema/if_and_then_without_else.py b/samples/client/3_1_0_unit_test/python/src/unit_test_api/components/schema/if_and_then_without_else.py index e331a745941..4678f975c85 100644 --- a/samples/client/3_1_0_unit_test/python/src/unit_test_api/components/schema/if_and_then_without_else.py +++ b/samples/client/3_1_0_unit_test/python/src/unit_test_api/components/schema/if_and_then_without_else.py @@ -10,15 +10,7 @@ from __future__ import annotations from unit_test_api.shared_imports.schema_imports import * # pyright: ignore [reportWildcardImportFromLibrary] - - -@dataclasses.dataclass(frozen=True) -class _If( - schemas.AnyTypeSchema[schemas.immutabledict[str, schemas.OUTPUT_BASE_TYPES], typing.Tuple[schemas.OUTPUT_BASE_TYPES, ...]], -): - # any type - exclusive_maximum: typing.Union[int, float] = 0 - +_If: typing_extensions.TypeAlias = schemas.AnyTypeSchema @dataclasses.dataclass(frozen=True) diff --git a/samples/client/3_1_0_unit_test/python/src/unit_test_api/components/schema/non_interference_across_combined_schemas.py b/samples/client/3_1_0_unit_test/python/src/unit_test_api/components/schema/non_interference_across_combined_schemas.py index 57ec2513f21..d2dc3c40858 100644 --- a/samples/client/3_1_0_unit_test/python/src/unit_test_api/components/schema/non_interference_across_combined_schemas.py +++ b/samples/client/3_1_0_unit_test/python/src/unit_test_api/components/schema/non_interference_across_combined_schemas.py @@ -10,15 +10,7 @@ from __future__ import annotations from unit_test_api.shared_imports.schema_imports import * # pyright: ignore [reportWildcardImportFromLibrary] - - -@dataclasses.dataclass(frozen=True) -class _If( - schemas.AnyTypeSchema[schemas.immutabledict[str, schemas.OUTPUT_BASE_TYPES], typing.Tuple[schemas.OUTPUT_BASE_TYPES, ...]], -): - # any type - exclusive_maximum: typing.Union[int, float] = 0 - +_If: typing_extensions.TypeAlias = schemas.AnyTypeSchema @dataclasses.dataclass(frozen=True) diff --git a/samples/client/3_1_0_unit_test/python/src/unit_test_api/components/schema/validate_against_correct_branch_then_vs_else.py b/samples/client/3_1_0_unit_test/python/src/unit_test_api/components/schema/validate_against_correct_branch_then_vs_else.py index 560234699ee..80c75c7db00 100644 --- a/samples/client/3_1_0_unit_test/python/src/unit_test_api/components/schema/validate_against_correct_branch_then_vs_else.py +++ b/samples/client/3_1_0_unit_test/python/src/unit_test_api/components/schema/validate_against_correct_branch_then_vs_else.py @@ -19,15 +19,7 @@ class _Else( # any type multiple_of: typing.Union[int, float] = 2 - - -@dataclasses.dataclass(frozen=True) -class _If( - schemas.AnyTypeSchema[schemas.immutabledict[str, schemas.OUTPUT_BASE_TYPES], typing.Tuple[schemas.OUTPUT_BASE_TYPES, ...]], -): - # any type - exclusive_maximum: typing.Union[int, float] = 0 - +_If: typing_extensions.TypeAlias = schemas.AnyTypeSchema @dataclasses.dataclass(frozen=True) diff --git a/src/main/java/org/openapijsonschematools/codegen/generators/openapimodels/CodegenSchema.java b/src/main/java/org/openapijsonschematools/codegen/generators/openapimodels/CodegenSchema.java index e49b00a0a28..ba877a82a36 100644 --- a/src/main/java/org/openapijsonschematools/codegen/generators/openapimodels/CodegenSchema.java +++ b/src/main/java/org/openapijsonschematools/codegen/generators/openapimodels/CodegenSchema.java @@ -304,7 +304,7 @@ public boolean isSimpleInteger() { if (!types.contains("integer")) { return false; } - if (allOf != null || anyOf != null || oneOf != null || not != null || if_ != null || then != null || else_ != null || enumInfo != null || constInfo != null || maximum != null || minimum != null || multipleOf != null) { + if (allOf != null || anyOf != null || oneOf != null || not != null || if_ != null || then != null || else_ != null || enumInfo != null || constInfo != null || maximum != null || minimum != null || exclusiveMaximum != null || exclusiveMinimum != null || multipleOf != null) { return false; } return true; @@ -320,7 +320,7 @@ public boolean isSimpleNumber() { if (!types.contains("number")) { return false; } - if (allOf != null || anyOf != null || oneOf != null || not != null || if_ != null || then != null || else_ != null || enumInfo != null || constInfo != null || maximum != null || minimum != null || multipleOf != null) { + if (allOf != null || anyOf != null || oneOf != null || not != null || if_ != null || then != null || else_ != null || enumInfo != null || constInfo != null || maximum != null || minimum != null || exclusiveMaximum != null || exclusiveMinimum != null || multipleOf != null) { return false; } return true; @@ -378,7 +378,7 @@ public boolean isSimpleAnyType() { if (types != null) { return false; } - if (allOf != null || anyOf != null || oneOf != null || not != null || if_ != null || then != null || else_ != null || enumInfo != null || constInfo != null || properties != null || requiredProperties != null || hasDiscriminatorWithNonEmptyMapping() != false || additionalProperties != null || dependentRequired != null || dependentSchemas != null || propertyNames != null || maxProperties != null || minProperties != null || patternProperties != null || unevaluatedProperties != null || items != null || uniqueItems != null || maxItems != null || minItems != null || contains != null || maxContains != null || minContains != null || prefixItems != null || unevaluatedItems != null || format != null || maxLength != null || minLength != null || maximum != null || minimum != null || multipleOf != null || patternInfo != null) { + if (allOf != null || anyOf != null || oneOf != null || not != null || if_ != null || then != null || else_ != null || enumInfo != null || constInfo != null || properties != null || requiredProperties != null || hasDiscriminatorWithNonEmptyMapping() != false || additionalProperties != null || dependentRequired != null || dependentSchemas != null || propertyNames != null || maxProperties != null || minProperties != null || patternProperties != null || unevaluatedProperties != null || items != null || uniqueItems != null || maxItems != null || minItems != null || contains != null || maxContains != null || minContains != null || prefixItems != null || unevaluatedItems != null || format != null || maxLength != null || minLength != null || maximum != null || minimum != null || exclusiveMaximum != null || exclusiveMinimum != null || multipleOf != null || patternInfo != null) { return false; } return true; diff --git a/src/main/resources/python/components/schemas/schema_cls/schema_cls.hbs b/src/main/resources/python/components/schemas/schema_cls/schema_cls.hbs index 87d11596e9c..5988b63d418 100644 --- a/src/main/resources/python/components/schemas/schema_cls/schema_cls.hbs +++ b/src/main/resources/python/components/schemas/schema_cls/schema_cls.hbs @@ -2,7 +2,7 @@ {{> components/schemas/schema_cls/_schema_var_equals_cls }} {{else}} {{#eq types null }} - {{#or allOf anyOf oneOf not if_ then else_ enumInfo constInfo properties requiredProperties hasDiscriminatorWithNonEmptyMapping additionalProperties dependentRequired dependentSchemas propertyNames (neq maxProperties null) (neq minProperties null) patternProperties unevaluatedProperties items uniqueItems (neq maxItems null) (neq minItems null) contains (neq maxContains null) (neq minContains null) prefixItems unevaluatedItems format (neq maxLength null) (neq minLength null) maximum minimum multipleOf patternInfo }} + {{#or allOf anyOf oneOf not if_ then else_ enumInfo constInfo properties requiredProperties hasDiscriminatorWithNonEmptyMapping additionalProperties dependentRequired dependentSchemas propertyNames (neq maxProperties null) (neq minProperties null) patternProperties unevaluatedProperties items uniqueItems (neq maxItems null) (neq minItems null) contains (neq maxContains null) (neq minContains null) prefixItems unevaluatedItems format (neq maxLength null) (neq minLength null) maximum minimum exclusiveMaximum exclusiveMinimum multipleOf patternInfo }} {{> components/schemas/schema_cls/_schema_anytype_or_multitype }} {{else}} {{> components/schemas/schema_cls/_schema_var_equals_cls }} @@ -34,7 +34,7 @@ {{/or}} {{else}} {{#or (eq this "number") (eq this "integer") }} - {{#or allOf anyOf oneOf not if_ then else_ enumInfo constInfo maximum minimum multipleOf }} + {{#or allOf anyOf oneOf not if_ then else_ enumInfo constInfo maximum minimum exclusiveMaximum exclusiveMinimum multipleOf }} {{> components/schemas/schema_cls/_schema_number }} {{else}} {{> components/schemas/schema_cls/_schema_var_equals_cls }} From 4f205abc0e5afec8f5015ec102966a8a8cba2f7f Mon Sep 17 00:00:00 2001 From: Justin Black Date: Mon, 4 Dec 2023 14:19:17 -0800 Subject: [PATCH 06/15] Samples regen --- .../schema/exclusivemaximum_validation.py | 15 ++++++++++++++- .../schema/exclusiveminimum_validation.py | 15 ++++++++++++++- 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/samples/client/3_1_0_unit_test/python/src/unit_test_api/components/schema/exclusivemaximum_validation.py b/samples/client/3_1_0_unit_test/python/src/unit_test_api/components/schema/exclusivemaximum_validation.py index e8decfe972e..3e27fb50171 100644 --- a/samples/client/3_1_0_unit_test/python/src/unit_test_api/components/schema/exclusivemaximum_validation.py +++ b/samples/client/3_1_0_unit_test/python/src/unit_test_api/components/schema/exclusivemaximum_validation.py @@ -10,4 +10,17 @@ from __future__ import annotations from unit_test_api.shared_imports.schema_imports import * # pyright: ignore [reportWildcardImportFromLibrary] -ExclusivemaximumValidation: typing_extensions.TypeAlias = schemas.AnyTypeSchema + + +@dataclasses.dataclass(frozen=True) +class ExclusivemaximumValidation( + schemas.AnyTypeSchema[schemas.immutabledict[str, schemas.OUTPUT_BASE_TYPES], typing.Tuple[schemas.OUTPUT_BASE_TYPES, ...]], +): + """NOTE: This class is auto generated by OpenAPI JSON Schema Generator. + Ref: https://github.com/openapi-json-schema-tools/openapi-json-schema-generator + + Do not edit the class manually. + """ + # any type + exclusive_maximum: typing.Union[int, float] = 3.0 + diff --git a/samples/client/3_1_0_unit_test/python/src/unit_test_api/components/schema/exclusiveminimum_validation.py b/samples/client/3_1_0_unit_test/python/src/unit_test_api/components/schema/exclusiveminimum_validation.py index 2b6af520f56..71fbf08c25c 100644 --- a/samples/client/3_1_0_unit_test/python/src/unit_test_api/components/schema/exclusiveminimum_validation.py +++ b/samples/client/3_1_0_unit_test/python/src/unit_test_api/components/schema/exclusiveminimum_validation.py @@ -10,4 +10,17 @@ from __future__ import annotations from unit_test_api.shared_imports.schema_imports import * # pyright: ignore [reportWildcardImportFromLibrary] -ExclusiveminimumValidation: typing_extensions.TypeAlias = schemas.AnyTypeSchema + + +@dataclasses.dataclass(frozen=True) +class ExclusiveminimumValidation( + schemas.AnyTypeSchema[schemas.immutabledict[str, schemas.OUTPUT_BASE_TYPES], typing.Tuple[schemas.OUTPUT_BASE_TYPES, ...]], +): + """NOTE: This class is auto generated by OpenAPI JSON Schema Generator. + Ref: https://github.com/openapi-json-schema-tools/openapi-json-schema-generator + + Do not edit the class manually. + """ + # any type + exclusive_minimum: typing.Union[int, float] = 1.1 + From ccfd27683a70b4c8ead09ddf3b6b5c713ca637bd Mon Sep 17 00:00:00 2001 From: Justin Black Date: Mon, 4 Dec 2023 14:28:02 -0800 Subject: [PATCH 07/15] Updates python templates to use isSimpleX --- .../schemas/schema_cls/schema_cls.hbs | 38 ++++++++++--------- 1 file changed, 21 insertions(+), 17 deletions(-) diff --git a/src/main/resources/python/components/schemas/schema_cls/schema_cls.hbs b/src/main/resources/python/components/schemas/schema_cls/schema_cls.hbs index 5988b63d418..674c1cf8edf 100644 --- a/src/main/resources/python/components/schemas/schema_cls/schema_cls.hbs +++ b/src/main/resources/python/components/schemas/schema_cls/schema_cls.hbs @@ -13,38 +13,42 @@ {{! one type }} {{#each types}} {{#eq this "object"}} - {{#or allOf anyOf oneOf not if_ then else_ properties requiredProperties hasDiscriminatorWithNonEmptyMapping additionalProperties dependentRequired dependentSchemas propertyNames (neq maxProperties null) (neq minProperties null) patternProperties unevaluatedProperties }} -{{> components/schemas/schema_cls/_schema_dict }} - {{else}} + {{#if isSimpleObject }} {{> components/schemas/schema_cls/_schema_var_equals_cls }} - {{/or}} + {{else}} +{{> components/schemas/schema_cls/_schema_dict }} + {{/if}} {{else}} {{#eq this "array"}} - {{#or allOf anyOf oneOf not if_ then else_ items uniqueItems contains (neq maxContains null) (neq minContains null) (neq maxItems null) (neq minItems null) prefixItems unevaluatedItems }} -{{> components/schemas/schema_cls/_schema_list }} - {{else}} + {{#if isSimpleArray }} {{> components/schemas/schema_cls/_schema_var_equals_cls }} - {{/or}} + {{else}} +{{> components/schemas/schema_cls/_schema_list }} + {{/if}} {{else}} {{#eq this "boolean"}} - {{#or allOf anyOf oneOf not if_ then else_ enumInfo constInfo }} -{{> components/schemas/schema_cls/_schema_boolean }} - {{else}} + {{#if isSimpleBoolean }} {{> components/schemas/schema_cls/_schema_var_equals_cls }} - {{/or}} + {{else}} +{{> components/schemas/schema_cls/_schema_boolean }} + {{/if}} {{else}} {{#or (eq this "number") (eq this "integer") }} - {{#or allOf anyOf oneOf not if_ then else_ enumInfo constInfo maximum minimum exclusiveMaximum exclusiveMinimum multipleOf }} -{{> components/schemas/schema_cls/_schema_number }} - {{else}} + {{#or isSimpleInteger isSimpleNumber }} {{> components/schemas/schema_cls/_schema_var_equals_cls }} + {{else}} +{{> components/schemas/schema_cls/_schema_number }} {{/or}} {{else}} - {{#or allOf anyOf oneOf not if_ then else_ enumInfo constInfo defaultValue (neq maxLength null) (neq minLength null) patternInfo }} + {{#eq this "string"}} + {{#if isSimpleString }} +{{> components/schemas/schema_cls/_schema_var_equals_cls }} + {{else}} {{> components/schemas/schema_cls/_schema_string }} + {{/if}} {{else}} {{> components/schemas/schema_cls/_schema_var_equals_cls }} - {{/or}} + {{/eq}} {{/or}} {{/eq}} {{/eq}} From 2af306b854c7f1fffe71e1af0f8e51afcd899b15 Mon Sep 17 00:00:00 2001 From: Justin Black Date: Mon, 4 Dec 2023 15:47:10 -0800 Subject: [PATCH 08/15] Samples updated --- .../schema/uniqueitems_false_validation.py | 14 +++++++++++++- .../components/schema/if_and_else_without_then.py | 9 ++++++++- .../components/schema/if_and_then_without_else.py | 9 ++++++++- .../non_interference_across_combined_schemas.py | 9 ++++++++- .../schema/uniqueitems_false_validation.py | 14 +++++++++++++- ...validate_against_correct_branch_then_vs_else.py | 9 ++++++++- .../components/schema/composed_none.py | 1 + .../components/schemas/schema_cls/schema_cls.hbs | 12 ++++++++---- 8 files changed, 67 insertions(+), 10 deletions(-) diff --git a/samples/client/3_0_3_unit_test/python/src/unit_test_api/components/schema/uniqueitems_false_validation.py b/samples/client/3_0_3_unit_test/python/src/unit_test_api/components/schema/uniqueitems_false_validation.py index c7cd553346d..84b99bf43f5 100644 --- a/samples/client/3_0_3_unit_test/python/src/unit_test_api/components/schema/uniqueitems_false_validation.py +++ b/samples/client/3_0_3_unit_test/python/src/unit_test_api/components/schema/uniqueitems_false_validation.py @@ -10,4 +10,16 @@ from __future__ import annotations from unit_test_api.shared_imports.schema_imports import * # pyright: ignore [reportWildcardImportFromLibrary] -UniqueitemsFalseValidation: typing_extensions.TypeAlias = schemas.AnyTypeSchema + + +@dataclasses.dataclass(frozen=True) +class UniqueitemsFalseValidation( + schemas.AnyTypeSchema[schemas.immutabledict[str, schemas.OUTPUT_BASE_TYPES], typing.Tuple[schemas.OUTPUT_BASE_TYPES, ...]], +): + """NOTE: This class is auto generated by OpenAPI JSON Schema Generator. + Ref: https://github.com/openapi-json-schema-tools/openapi-json-schema-generator + + Do not edit the class manually. + """ + # any type + diff --git a/samples/client/3_1_0_unit_test/python/src/unit_test_api/components/schema/if_and_else_without_then.py b/samples/client/3_1_0_unit_test/python/src/unit_test_api/components/schema/if_and_else_without_then.py index 20521b4e191..7931c6c541f 100644 --- a/samples/client/3_1_0_unit_test/python/src/unit_test_api/components/schema/if_and_else_without_then.py +++ b/samples/client/3_1_0_unit_test/python/src/unit_test_api/components/schema/if_and_else_without_then.py @@ -19,7 +19,14 @@ class _Else( # any type multiple_of: typing.Union[int, float] = 2 -_If: typing_extensions.TypeAlias = schemas.AnyTypeSchema + + +@dataclasses.dataclass(frozen=True) +class _If( + schemas.AnyTypeSchema[schemas.immutabledict[str, schemas.OUTPUT_BASE_TYPES], typing.Tuple[schemas.OUTPUT_BASE_TYPES, ...]], +): + # any type + @dataclasses.dataclass(frozen=True) diff --git a/samples/client/3_1_0_unit_test/python/src/unit_test_api/components/schema/if_and_then_without_else.py b/samples/client/3_1_0_unit_test/python/src/unit_test_api/components/schema/if_and_then_without_else.py index 4678f975c85..3d444dd1fdd 100644 --- a/samples/client/3_1_0_unit_test/python/src/unit_test_api/components/schema/if_and_then_without_else.py +++ b/samples/client/3_1_0_unit_test/python/src/unit_test_api/components/schema/if_and_then_without_else.py @@ -10,7 +10,14 @@ from __future__ import annotations from unit_test_api.shared_imports.schema_imports import * # pyright: ignore [reportWildcardImportFromLibrary] -_If: typing_extensions.TypeAlias = schemas.AnyTypeSchema + + +@dataclasses.dataclass(frozen=True) +class _If( + schemas.AnyTypeSchema[schemas.immutabledict[str, schemas.OUTPUT_BASE_TYPES], typing.Tuple[schemas.OUTPUT_BASE_TYPES, ...]], +): + # any type + @dataclasses.dataclass(frozen=True) diff --git a/samples/client/3_1_0_unit_test/python/src/unit_test_api/components/schema/non_interference_across_combined_schemas.py b/samples/client/3_1_0_unit_test/python/src/unit_test_api/components/schema/non_interference_across_combined_schemas.py index d2dc3c40858..5fe33211c2d 100644 --- a/samples/client/3_1_0_unit_test/python/src/unit_test_api/components/schema/non_interference_across_combined_schemas.py +++ b/samples/client/3_1_0_unit_test/python/src/unit_test_api/components/schema/non_interference_across_combined_schemas.py @@ -10,7 +10,14 @@ from __future__ import annotations from unit_test_api.shared_imports.schema_imports import * # pyright: ignore [reportWildcardImportFromLibrary] -_If: typing_extensions.TypeAlias = schemas.AnyTypeSchema + + +@dataclasses.dataclass(frozen=True) +class _If( + schemas.AnyTypeSchema[schemas.immutabledict[str, schemas.OUTPUT_BASE_TYPES], typing.Tuple[schemas.OUTPUT_BASE_TYPES, ...]], +): + # any type + @dataclasses.dataclass(frozen=True) diff --git a/samples/client/3_1_0_unit_test/python/src/unit_test_api/components/schema/uniqueitems_false_validation.py b/samples/client/3_1_0_unit_test/python/src/unit_test_api/components/schema/uniqueitems_false_validation.py index 0f57295ee10..1d194a46e98 100644 --- a/samples/client/3_1_0_unit_test/python/src/unit_test_api/components/schema/uniqueitems_false_validation.py +++ b/samples/client/3_1_0_unit_test/python/src/unit_test_api/components/schema/uniqueitems_false_validation.py @@ -10,4 +10,16 @@ from __future__ import annotations from unit_test_api.shared_imports.schema_imports import * # pyright: ignore [reportWildcardImportFromLibrary] -UniqueitemsFalseValidation: typing_extensions.TypeAlias = schemas.AnyTypeSchema + + +@dataclasses.dataclass(frozen=True) +class UniqueitemsFalseValidation( + schemas.AnyTypeSchema[schemas.immutabledict[str, schemas.OUTPUT_BASE_TYPES], typing.Tuple[schemas.OUTPUT_BASE_TYPES, ...]], +): + """NOTE: This class is auto generated by OpenAPI JSON Schema Generator. + Ref: https://github.com/openapi-json-schema-tools/openapi-json-schema-generator + + Do not edit the class manually. + """ + # any type + diff --git a/samples/client/3_1_0_unit_test/python/src/unit_test_api/components/schema/validate_against_correct_branch_then_vs_else.py b/samples/client/3_1_0_unit_test/python/src/unit_test_api/components/schema/validate_against_correct_branch_then_vs_else.py index 80c75c7db00..90167b067c3 100644 --- a/samples/client/3_1_0_unit_test/python/src/unit_test_api/components/schema/validate_against_correct_branch_then_vs_else.py +++ b/samples/client/3_1_0_unit_test/python/src/unit_test_api/components/schema/validate_against_correct_branch_then_vs_else.py @@ -19,7 +19,14 @@ class _Else( # any type multiple_of: typing.Union[int, float] = 2 -_If: typing_extensions.TypeAlias = schemas.AnyTypeSchema + + +@dataclasses.dataclass(frozen=True) +class _If( + schemas.AnyTypeSchema[schemas.immutabledict[str, schemas.OUTPUT_BASE_TYPES], typing.Tuple[schemas.OUTPUT_BASE_TYPES, ...]], +): + # any type + @dataclasses.dataclass(frozen=True) diff --git a/samples/client/petstore/python/src/petstore_api/components/schema/composed_none.py b/samples/client/petstore/python/src/petstore_api/components/schema/composed_none.py index 36e09bcaa5c..f71cbfae8e7 100644 --- a/samples/client/petstore/python/src/petstore_api/components/schema/composed_none.py +++ b/samples/client/petstore/python/src/petstore_api/components/schema/composed_none.py @@ -29,3 +29,4 @@ class ComposedNone( type(None), }) all_of: AllOf = dataclasses.field(default_factory=lambda: schemas.tuple_to_instance(AllOf)) # type: ignore + diff --git a/src/main/resources/python/components/schemas/schema_cls/schema_cls.hbs b/src/main/resources/python/components/schemas/schema_cls/schema_cls.hbs index 674c1cf8edf..d936980ae2d 100644 --- a/src/main/resources/python/components/schemas/schema_cls/schema_cls.hbs +++ b/src/main/resources/python/components/schemas/schema_cls/schema_cls.hbs @@ -2,11 +2,11 @@ {{> components/schemas/schema_cls/_schema_var_equals_cls }} {{else}} {{#eq types null }} - {{#or allOf anyOf oneOf not if_ then else_ enumInfo constInfo properties requiredProperties hasDiscriminatorWithNonEmptyMapping additionalProperties dependentRequired dependentSchemas propertyNames (neq maxProperties null) (neq minProperties null) patternProperties unevaluatedProperties items uniqueItems (neq maxItems null) (neq minItems null) contains (neq maxContains null) (neq minContains null) prefixItems unevaluatedItems format (neq maxLength null) (neq minLength null) maximum minimum exclusiveMaximum exclusiveMinimum multipleOf patternInfo }} -{{> components/schemas/schema_cls/_schema_anytype_or_multitype }} - {{else}} + {{#if isSimpleAnyType }} {{> components/schemas/schema_cls/_schema_var_equals_cls }} - {{/or}} + {{else}} +{{> components/schemas/schema_cls/_schema_anytype_or_multitype }} + {{/if}} {{else}} {{! types exist }} {{#eq types.size 1}} @@ -47,7 +47,11 @@ {{> components/schemas/schema_cls/_schema_string }} {{/if}} {{else}} + {{#if isSimpleNull }} {{> components/schemas/schema_cls/_schema_var_equals_cls }} + {{else}} +{{> components/schemas/schema_cls/_schema_anytype_or_multitype }} + {{/if}} {{/eq}} {{/or}} {{/eq}} From 5fc09683bab4db80bce1c3926ae9a1b5c42beb79 Mon Sep 17 00:00:00 2001 From: Justin Black Date: Mon, 4 Dec 2023 15:57:15 -0800 Subject: [PATCH 09/15] Improves exclusive max and min handling in python templates --- .../components/schema/if_and_else_without_then.py | 1 + .../components/schema/if_and_then_without_else.py | 1 + .../schema/non_interference_across_combined_schemas.py | 1 + .../validate_against_correct_branch_then_vs_else.py | 1 + .../schemas/schema_cls/_schema_anytype_or_multitype.hbs | 8 ++++---- .../components/schemas/schema_cls/_schema_number.hbs | 8 ++++---- 6 files changed, 12 insertions(+), 8 deletions(-) diff --git a/samples/client/3_1_0_unit_test/python/src/unit_test_api/components/schema/if_and_else_without_then.py b/samples/client/3_1_0_unit_test/python/src/unit_test_api/components/schema/if_and_else_without_then.py index 7931c6c541f..63f498c4997 100644 --- a/samples/client/3_1_0_unit_test/python/src/unit_test_api/components/schema/if_and_else_without_then.py +++ b/samples/client/3_1_0_unit_test/python/src/unit_test_api/components/schema/if_and_else_without_then.py @@ -26,6 +26,7 @@ class _If( schemas.AnyTypeSchema[schemas.immutabledict[str, schemas.OUTPUT_BASE_TYPES], typing.Tuple[schemas.OUTPUT_BASE_TYPES, ...]], ): # any type + exclusive_maximum: typing.Union[int, float] = 0 diff --git a/samples/client/3_1_0_unit_test/python/src/unit_test_api/components/schema/if_and_then_without_else.py b/samples/client/3_1_0_unit_test/python/src/unit_test_api/components/schema/if_and_then_without_else.py index 3d444dd1fdd..e331a745941 100644 --- a/samples/client/3_1_0_unit_test/python/src/unit_test_api/components/schema/if_and_then_without_else.py +++ b/samples/client/3_1_0_unit_test/python/src/unit_test_api/components/schema/if_and_then_without_else.py @@ -17,6 +17,7 @@ class _If( schemas.AnyTypeSchema[schemas.immutabledict[str, schemas.OUTPUT_BASE_TYPES], typing.Tuple[schemas.OUTPUT_BASE_TYPES, ...]], ): # any type + exclusive_maximum: typing.Union[int, float] = 0 diff --git a/samples/client/3_1_0_unit_test/python/src/unit_test_api/components/schema/non_interference_across_combined_schemas.py b/samples/client/3_1_0_unit_test/python/src/unit_test_api/components/schema/non_interference_across_combined_schemas.py index 5fe33211c2d..57ec2513f21 100644 --- a/samples/client/3_1_0_unit_test/python/src/unit_test_api/components/schema/non_interference_across_combined_schemas.py +++ b/samples/client/3_1_0_unit_test/python/src/unit_test_api/components/schema/non_interference_across_combined_schemas.py @@ -17,6 +17,7 @@ class _If( schemas.AnyTypeSchema[schemas.immutabledict[str, schemas.OUTPUT_BASE_TYPES], typing.Tuple[schemas.OUTPUT_BASE_TYPES, ...]], ): # any type + exclusive_maximum: typing.Union[int, float] = 0 diff --git a/samples/client/3_1_0_unit_test/python/src/unit_test_api/components/schema/validate_against_correct_branch_then_vs_else.py b/samples/client/3_1_0_unit_test/python/src/unit_test_api/components/schema/validate_against_correct_branch_then_vs_else.py index 90167b067c3..560234699ee 100644 --- a/samples/client/3_1_0_unit_test/python/src/unit_test_api/components/schema/validate_against_correct_branch_then_vs_else.py +++ b/samples/client/3_1_0_unit_test/python/src/unit_test_api/components/schema/validate_against_correct_branch_then_vs_else.py @@ -26,6 +26,7 @@ class _If( schemas.AnyTypeSchema[schemas.immutabledict[str, schemas.OUTPUT_BASE_TYPES], typing.Tuple[schemas.OUTPUT_BASE_TYPES, ...]], ): # any type + exclusive_maximum: typing.Union[int, float] = 0 diff --git a/src/main/resources/python/components/schemas/schema_cls/_schema_anytype_or_multitype.hbs b/src/main/resources/python/components/schemas/schema_cls/_schema_anytype_or_multitype.hbs index fb4a0e68990..c0a75357351 100644 --- a/src/main/resources/python/components/schemas/schema_cls/_schema_anytype_or_multitype.hbs +++ b/src/main/resources/python/components/schemas/schema_cls/_schema_anytype_or_multitype.hbs @@ -81,12 +81,12 @@ class {{jsonPathPiece.camelCase}}( {{#if minimum}} {{> components/schemas/schema_cls/_minimum }} {{/if}} -{{#if exclusiveMaximum}} +{{#neq exclusiveMaximum null }} {{> components/schemas/schema_cls/_exclusive_maximum }} -{{/if}} -{{#if exclusiveMinimum}} +{{/neq}} +{{#neq exclusiveMinimum null }} {{> components/schemas/schema_cls/_exclusive_minimum }} -{{/if}} +{{/neq}} {{#if multipleOf}} {{> components/schemas/schema_cls/_multiple_of }} {{/if}} diff --git a/src/main/resources/python/components/schemas/schema_cls/_schema_number.hbs b/src/main/resources/python/components/schemas/schema_cls/_schema_number.hbs index 331a46fb430..a4eaa3a715e 100644 --- a/src/main/resources/python/components/schemas/schema_cls/_schema_number.hbs +++ b/src/main/resources/python/components/schemas/schema_cls/_schema_number.hbs @@ -25,12 +25,12 @@ class {{jsonPathPiece.camelCase}}( {{#if minimum}} {{> components/schemas/schema_cls/_minimum }} {{/if}} -{{#if exclusiveMaximum}} +{{#neq exclusiveMaximum null }} {{> components/schemas/schema_cls/_exclusive_maximum }} -{{/if}} -{{#if exclusiveMinimum}} +{{/neq}} +{{#neq exclusiveMinimum null }} {{> components/schemas/schema_cls/_exclusive_minimum }} -{{/if}} +{{/neq}} {{#if multipleOf}} {{> components/schemas/schema_cls/_multiple_of }} {{/if}} From c88196c02ca504e5bcfe87f13749f4357011e097 Mon Sep 17 00:00:00 2001 From: Justin Black Date: Mon, 4 Dec 2023 16:17:25 -0800 Subject: [PATCH 10/15] Fixes handling uniqueItems in python --- .../components/schema/uniqueitems_false_validation.py | 1 + .../components/schema/uniqueitems_false_validation.py | 1 + .../schema/uniqueitems_false_with_an_array_of_items.py | 1 + .../schemas/schema_cls/_schema_anytype_or_multitype.hbs | 4 ++-- .../python/components/schemas/schema_cls/_schema_list.hbs | 4 ++-- 5 files changed, 7 insertions(+), 4 deletions(-) diff --git a/samples/client/3_0_3_unit_test/python/src/unit_test_api/components/schema/uniqueitems_false_validation.py b/samples/client/3_0_3_unit_test/python/src/unit_test_api/components/schema/uniqueitems_false_validation.py index 84b99bf43f5..0bb08617d2c 100644 --- a/samples/client/3_0_3_unit_test/python/src/unit_test_api/components/schema/uniqueitems_false_validation.py +++ b/samples/client/3_0_3_unit_test/python/src/unit_test_api/components/schema/uniqueitems_false_validation.py @@ -22,4 +22,5 @@ class UniqueitemsFalseValidation( Do not edit the class manually. """ # any type + unique_items: bool = False diff --git a/samples/client/3_1_0_unit_test/python/src/unit_test_api/components/schema/uniqueitems_false_validation.py b/samples/client/3_1_0_unit_test/python/src/unit_test_api/components/schema/uniqueitems_false_validation.py index 1d194a46e98..0b1e02cf304 100644 --- a/samples/client/3_1_0_unit_test/python/src/unit_test_api/components/schema/uniqueitems_false_validation.py +++ b/samples/client/3_1_0_unit_test/python/src/unit_test_api/components/schema/uniqueitems_false_validation.py @@ -22,4 +22,5 @@ class UniqueitemsFalseValidation( Do not edit the class manually. """ # any type + unique_items: bool = False diff --git a/samples/client/3_1_0_unit_test/python/src/unit_test_api/components/schema/uniqueitems_false_with_an_array_of_items.py b/samples/client/3_1_0_unit_test/python/src/unit_test_api/components/schema/uniqueitems_false_with_an_array_of_items.py index f1dde470e8c..c64ed411129 100644 --- a/samples/client/3_1_0_unit_test/python/src/unit_test_api/components/schema/uniqueitems_false_with_an_array_of_items.py +++ b/samples/client/3_1_0_unit_test/python/src/unit_test_api/components/schema/uniqueitems_false_with_an_array_of_items.py @@ -31,4 +31,5 @@ class UniqueitemsFalseWithAnArrayOfItems( _0, _1, ) + unique_items: bool = False diff --git a/src/main/resources/python/components/schemas/schema_cls/_schema_anytype_or_multitype.hbs b/src/main/resources/python/components/schemas/schema_cls/_schema_anytype_or_multitype.hbs index c0a75357351..1d176daa906 100644 --- a/src/main/resources/python/components/schemas/schema_cls/_schema_anytype_or_multitype.hbs +++ b/src/main/resources/python/components/schemas/schema_cls/_schema_anytype_or_multitype.hbs @@ -54,9 +54,9 @@ class {{jsonPathPiece.camelCase}}( {{#if properties}} {{> components/schemas/schema_cls/_properties }} {{/if}} -{{#if uniqueItems}} +{{#neq uniqueItems null }} {{> components/schemas/schema_cls/_unique_items }} -{{/if}} +{{/neq}} {{#neq maxLength null}} {{> components/schemas/schema_cls/_max_length }} {{/neq}} diff --git a/src/main/resources/python/components/schemas/schema_cls/_schema_list.hbs b/src/main/resources/python/components/schemas/schema_cls/_schema_list.hbs index 2a4490e75a6..c3d58efb3c3 100644 --- a/src/main/resources/python/components/schemas/schema_cls/_schema_list.hbs +++ b/src/main/resources/python/components/schemas/schema_cls/_schema_list.hbs @@ -16,9 +16,9 @@ class {{jsonPathPiece.camelCase}}( """ {{/if}} types: typing.FrozenSet[typing.Type] = frozenset({tuple}) - {{#if uniqueItems}} + {{#neq uniqueItems null }} {{> components/schemas/schema_cls/_unique_items }} - {{/if}} + {{/neq}} {{#neq maxItems null}} {{> components/schemas/schema_cls/_max_items }} {{/neq}} From 44f52212829f42b85819830d0b2af00c0a1f9939 Mon Sep 17 00:00:00 2001 From: Justin Black Date: Mon, 4 Dec 2023 16:28:53 -0800 Subject: [PATCH 11/15] Adds sample schema with exclusive min and max --- .../petstore/java/.openapi-generator/FILES | 3 ++ samples/client/petstore/java/README.md | 1 + .../schemas/NumberWithExclusiveMinMax.md | 27 ++++++++++ .../schemas/NumberWithExclusiveMinMax.java | 50 +++++++++++++++++++ .../NumberWithExclusiveMinMaxTest.java | 17 +++++++ .../codegen/common/ModelUtils.java | 13 ++++- .../3_0/python/petstore_customized.yaml | 8 ++- 7 files changed, 117 insertions(+), 2 deletions(-) create mode 100644 samples/client/petstore/java/docs/components/schemas/NumberWithExclusiveMinMax.md create mode 100644 samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/schemas/NumberWithExclusiveMinMax.java create mode 100644 samples/client/petstore/java/src/test/java/org/openapijsonschematools/client/components/schemas/NumberWithExclusiveMinMaxTest.java diff --git a/samples/client/petstore/java/.openapi-generator/FILES b/samples/client/petstore/java/.openapi-generator/FILES index 843df8a800b..61527e37c93 100644 --- a/samples/client/petstore/java/.openapi-generator/FILES +++ b/samples/client/petstore/java/.openapi-generator/FILES @@ -103,6 +103,7 @@ docs/components/schemas/NullableShape.md docs/components/schemas/NullableString.md docs/components/schemas/NumberOnly.md docs/components/schemas/NumberSchema.md +docs/components/schemas/NumberWithExclusiveMinMax.md docs/components/schemas/NumberWithValidations.md docs/components/schemas/ObjWithRequiredProps.md docs/components/schemas/ObjWithRequiredPropsBase.md @@ -406,6 +407,7 @@ src/main/java/org/openapijsonschematools/client/components/schemas/NullableShape src/main/java/org/openapijsonschematools/client/components/schemas/NullableString.java src/main/java/org/openapijsonschematools/client/components/schemas/NumberOnly.java src/main/java/org/openapijsonschematools/client/components/schemas/NumberSchema.java +src/main/java/org/openapijsonschematools/client/components/schemas/NumberWithExclusiveMinMax.java src/main/java/org/openapijsonschematools/client/components/schemas/NumberWithValidations.java src/main/java/org/openapijsonschematools/client/components/schemas/ObjWithRequiredProps.java src/main/java/org/openapijsonschematools/client/components/schemas/ObjWithRequiredPropsBase.java @@ -699,6 +701,7 @@ src/main/java/org/openapijsonschematools/client/schemas/validation/TypeValidator src/main/java/org/openapijsonschematools/client/schemas/validation/UniqueItemsValidator.java src/main/java/org/openapijsonschematools/client/schemas/validation/UnsetAnyTypeJsonSchema.java src/main/java/org/openapijsonschematools/client/schemas/validation/ValidationMetadata.java +src/test/java/org/openapijsonschematools/client/components/schemas/NumberWithExclusiveMinMaxTest.java src/test/java/org/openapijsonschematools/client/configurations/JsonSchemaKeywordFlagsTest.java src/test/java/org/openapijsonschematools/client/schemas/AnyTypeSchemaTest.java src/test/java/org/openapijsonschematools/client/schemas/ArrayTypeSchemaTest.java diff --git a/samples/client/petstore/java/README.md b/samples/client/petstore/java/README.md index 1c42187e95b..a8e8c5745ba 100644 --- a/samples/client/petstore/java/README.md +++ b/samples/client/petstore/java/README.md @@ -234,6 +234,7 @@ allowed input and output types. | [NullableString.NullableString1](docs/components/schemas/NullableString.md#nullablestring1) | | | [NumberSchema.NumberSchema1](docs/components/schemas/NumberSchema.md#numberschema1) | | | [NumberOnly.NumberOnly1](docs/components/schemas/NumberOnly.md#numberonly1) | | +| [NumberWithExclusiveMinMax.NumberWithExclusiveMinMax1](docs/components/schemas/NumberWithExclusiveMinMax.md#numberwithexclusiveminmax1) | | | [NumberWithValidations.NumberWithValidations1](docs/components/schemas/NumberWithValidations.md#numberwithvalidations1) | | | [ObjWithRequiredProps.ObjWithRequiredProps1](docs/components/schemas/ObjWithRequiredProps.md#objwithrequiredprops1) | | | [ObjWithRequiredPropsBase.ObjWithRequiredPropsBase1](docs/components/schemas/ObjWithRequiredPropsBase.md#objwithrequiredpropsbase1) | | diff --git a/samples/client/petstore/java/docs/components/schemas/NumberWithExclusiveMinMax.md b/samples/client/petstore/java/docs/components/schemas/NumberWithExclusiveMinMax.md new file mode 100644 index 00000000000..5767f573864 --- /dev/null +++ b/samples/client/petstore/java/docs/components/schemas/NumberWithExclusiveMinMax.md @@ -0,0 +1,27 @@ +# NumberWithExclusiveMinMax +org.openapijsonschematools.client.components.schemas.NumberWithExclusiveMinMax.java +public class NumberWithExclusiveMinMax + +A class that contains necessary nested schema classes, and classes to store validated list and map payloads + +## Nested Class Summary +| Modifier and Type | Class and Description | +| ----------------- | ---------------------- | +| static class | [NumberWithExclusiveMinMax.NumberWithExclusiveMinMax1](#numberwithexclusiveminmax1)
schema class | + +## NumberWithExclusiveMinMax1 +public static class NumberWithExclusiveMinMax1
+extends JsonSchema + +A schema class that validates payloads +### Field Summary +| Modifier and Type | Field and Description | +| ----------------- | ---------------------- | +| static LinkedHashMap |keywordToValidator
new LinkedHashMap<>(Map.ofEntries(
    new KeywordEntry("type", new TypeValidator(Set.of(
        Integer.class,
        Long.class,
        Float.class,
        Double.class
    ))),
    new KeywordEntry("exclusiveMaximum", new ExclusiveMaximumValidator()),
    new KeywordEntry("exclusiveMinimum", new ExclusiveMinimumValidator())
)); | + +### Method Summary +| Modifier and Type | Method and Description | +| ----------------- | ---------------------- | +| static Number | validate(Number arg, SchemaConfiguration configuration) | + +[[Back to top]](#top) [[Back to Component Schemas]](../../../README.md#Component-Schemas) [[Back to README]](../../../README.md) diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/schemas/NumberWithExclusiveMinMax.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/schemas/NumberWithExclusiveMinMax.java new file mode 100644 index 00000000000..3712cfe1304 --- /dev/null +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/schemas/NumberWithExclusiveMinMax.java @@ -0,0 +1,50 @@ +package org.openapijsonschematools.client.components.schemas; +import java.util.LinkedHashMap; +import java.util.Map; +import java.util.Set; +import org.openapijsonschematools.client.configurations.SchemaConfiguration; +import org.openapijsonschematools.client.exceptions.ValidationException; +import org.openapijsonschematools.client.schemas.validation.ExclusiveMaximumValidator; +import org.openapijsonschematools.client.schemas.validation.ExclusiveMinimumValidator; +import org.openapijsonschematools.client.schemas.validation.JsonSchema; +import org.openapijsonschematools.client.schemas.validation.KeywordEntry; +import org.openapijsonschematools.client.schemas.validation.KeywordValidator; +import org.openapijsonschematools.client.schemas.validation.TypeValidator; + +public class NumberWithExclusiveMinMax { + // nest classes so all schemas and input/output classes can be public + + + public static class NumberWithExclusiveMinMax1 extends JsonSchema { + /* + NOTE: This class is auto generated by OpenAPI JSON Schema Generator. + Ref: https://github.com/openapi-json-schema-tools/openapi-json-schema-generator + + Do not edit the class manually. + */ + public static final LinkedHashMap keywordToValidator = new LinkedHashMap<>(Map.ofEntries( + new KeywordEntry("type", new TypeValidator(Set.of( + Integer.class, + Long.class, + Float.class, + Double.class + ))), + new KeywordEntry("exclusiveMaximum", new ExclusiveMaximumValidator()), + new KeywordEntry("exclusiveMinimum", new ExclusiveMinimumValidator()) + )); + public static int validate(int arg, SchemaConfiguration configuration) throws ValidationException { + return JsonSchema.validateInt(NumberWithExclusiveMinMax1.class, arg, configuration); + } + + public static long validate(long arg, SchemaConfiguration configuration) throws ValidationException { + return JsonSchema.validateLong(NumberWithExclusiveMinMax1.class, arg, configuration); + } + + public static float validate(float arg, SchemaConfiguration configuration) throws ValidationException { + return JsonSchema.validateFloat(NumberWithExclusiveMinMax1.class, arg, configuration); + } + + public static double validate(double arg, SchemaConfiguration configuration) throws ValidationException { + return JsonSchema.validateDouble(NumberWithExclusiveMinMax1.class, arg, configuration); + } + }} diff --git a/samples/client/petstore/java/src/test/java/org/openapijsonschematools/client/components/schemas/NumberWithExclusiveMinMaxTest.java b/samples/client/petstore/java/src/test/java/org/openapijsonschematools/client/components/schemas/NumberWithExclusiveMinMaxTest.java new file mode 100644 index 00000000000..f32f20b211e --- /dev/null +++ b/samples/client/petstore/java/src/test/java/org/openapijsonschematools/client/components/schemas/NumberWithExclusiveMinMaxTest.java @@ -0,0 +1,17 @@ +package org.openapijsonschematools.client.components.schemas; + +import org.junit.Assert; +import org.junit.Test; +import org.openapijsonschematools.client.configurations.JsonSchemaKeywordFlags; +import org.openapijsonschematools.client.configurations.SchemaConfiguration; +import org.openapijsonschematools.client.exceptions.ValidationException; +import org.openapijsonschematools.client.schemas.validation.JsonSchema; +import org.openapijsonschematools.client.schemas.MapMaker; + +import java.util.Arrays; +import java.util.List; +import java.util.AbstractMap; + +public class NumberWithExclusiveMinMaxTest { + static final SchemaConfiguration configuration = new SchemaConfiguration(JsonSchemaKeywordFlags.ofNone()); +} diff --git a/src/main/java/org/openapijsonschematools/codegen/common/ModelUtils.java b/src/main/java/org/openapijsonschematools/codegen/common/ModelUtils.java index 668282636d4..1f195a49656 100644 --- a/src/main/java/org/openapijsonschematools/codegen/common/ModelUtils.java +++ b/src/main/java/org/openapijsonschematools/codegen/common/ModelUtils.java @@ -1503,9 +1503,20 @@ public static void syncValidationProperties(Schema schema, CodegenSchema target) BigDecimal multipleOf = schema.getMultipleOf(); BigDecimal minimum = schema.getMinimum(); BigDecimal maximum = schema.getMaximum(); + // 3.1.0 use case BigDecimal exclusiveMinimum = schema.getExclusiveMinimumValue(); + // 3.1.0 use case BigDecimal exclusiveMaximum = schema.getExclusiveMaximumValue(); - + // 3.0.0-3.0.3 use case + if (Boolean.TRUE.equals(schema.getExclusiveMinimum())) { + exclusiveMinimum = minimum; + minimum = null; + } + // 3.0.0-3.0.3 use case + if (Boolean.TRUE.equals(schema.getExclusiveMaximum())) { + exclusiveMaximum = maximum; + maximum = null; + } if (isArraySchema(schema)) { setArrayValidations(minItems, maxItems, uniqueItems, target); } else if (isTypeObjectSchema(schema)) { diff --git a/src/test/resources/3_0/python/petstore_customized.yaml b/src/test/resources/3_0/python/petstore_customized.yaml index e90ce3f089e..da548edc0bc 100644 --- a/src/test/resources/3_0/python/petstore_customized.yaml +++ b/src/test/resources/3_0/python/petstore_customized.yaml @@ -3420,4 +3420,10 @@ components: title: id additionalProperties: false type: object - title: MyObjectDto \ No newline at end of file + title: MyObjectDto + NumberWithExclusiveMinMax: + type: number + minimum: 10 + exclusiveMinimum: true + maximum: 12 + exclusiveMaximum: true \ No newline at end of file From 1e7f9a4318df7ccc8be88fa8b447bbd3a6ed0068 Mon Sep 17 00:00:00 2001 From: Justin Black Date: Mon, 4 Dec 2023 16:39:50 -0800 Subject: [PATCH 12/15] Samples updated --- .../petstore/java/.openapi-generator/FILES | 1 - .../petstore/python/.openapi-generator/FILES | 3 ++ samples/client/petstore/python/README.md | 1 + .../schema/number_with_exclusive_min_max.md | 12 ++++++++ .../schema/number_with_exclusive_min_max.py | 29 +++++++++++++++++++ .../components/schemas/__init__.py | 1 + .../test_number_with_exclusive_min_max.py | 25 ++++++++++++++++ .../schemas/SchemaClass/_exclusiveMaximum.hbs | 4 +-- .../schemas/SchemaClass/_exclusiveMinimum.hbs | 4 +-- 9 files changed, 75 insertions(+), 5 deletions(-) create mode 100644 samples/client/petstore/python/docs/components/schema/number_with_exclusive_min_max.md create mode 100644 samples/client/petstore/python/src/petstore_api/components/schema/number_with_exclusive_min_max.py create mode 100644 samples/client/petstore/python/test/components/schema/test_number_with_exclusive_min_max.py diff --git a/samples/client/petstore/java/.openapi-generator/FILES b/samples/client/petstore/java/.openapi-generator/FILES index 61527e37c93..d210fd4e6db 100644 --- a/samples/client/petstore/java/.openapi-generator/FILES +++ b/samples/client/petstore/java/.openapi-generator/FILES @@ -701,7 +701,6 @@ src/main/java/org/openapijsonschematools/client/schemas/validation/TypeValidator src/main/java/org/openapijsonschematools/client/schemas/validation/UniqueItemsValidator.java src/main/java/org/openapijsonschematools/client/schemas/validation/UnsetAnyTypeJsonSchema.java src/main/java/org/openapijsonschematools/client/schemas/validation/ValidationMetadata.java -src/test/java/org/openapijsonschematools/client/components/schemas/NumberWithExclusiveMinMaxTest.java src/test/java/org/openapijsonschematools/client/configurations/JsonSchemaKeywordFlagsTest.java src/test/java/org/openapijsonschematools/client/schemas/AnyTypeSchemaTest.java src/test/java/org/openapijsonschematools/client/schemas/ArrayTypeSchemaTest.java diff --git a/samples/client/petstore/python/.openapi-generator/FILES b/samples/client/petstore/python/.openapi-generator/FILES index d8a5fd45cd9..4b805fb931d 100644 --- a/samples/client/petstore/python/.openapi-generator/FILES +++ b/samples/client/petstore/python/.openapi-generator/FILES @@ -136,6 +136,7 @@ docs/components/schema/nullable_shape.md docs/components/schema/nullable_string.md docs/components/schema/number.md docs/components/schema/number_only.md +docs/components/schema/number_with_exclusive_min_max.md docs/components/schema/number_with_validations.md docs/components/schema/obj_with_required_props.md docs/components/schema/obj_with_required_props_base.md @@ -646,6 +647,7 @@ src/petstore_api/components/schema/nullable_shape.py src/petstore_api/components/schema/nullable_string.py src/petstore_api/components/schema/number.py src/petstore_api/components/schema/number_only.py +src/petstore_api/components/schema/number_with_exclusive_min_max.py src/petstore_api/components/schema/number_with_validations.py src/petstore_api/components/schema/obj_with_required_props.py src/petstore_api/components/schema/obj_with_required_props_base.py @@ -1593,4 +1595,5 @@ test-requirements.txt test/__init__.py test/components/__init__.py test/components/schema/__init__.py +test/components/schema/test_number_with_exclusive_min_max.py tox.ini diff --git a/samples/client/petstore/python/README.md b/samples/client/petstore/python/README.md index 95f4efd50d4..d7ccae1b955 100644 --- a/samples/client/petstore/python/README.md +++ b/samples/client/petstore/python/README.md @@ -323,6 +323,7 @@ Class | Description [NullableString](docs/components/schema/nullable_string.md) | [Number](docs/components/schema/number.md) | [NumberOnly](docs/components/schema/number_only.md) | +[NumberWithExclusiveMinMax](docs/components/schema/number_with_exclusive_min_max.md) | [NumberWithValidations](docs/components/schema/number_with_validations.md) | [ObjWithRequiredProps](docs/components/schema/obj_with_required_props.md) | [ObjWithRequiredPropsBase](docs/components/schema/obj_with_required_props_base.md) | diff --git a/samples/client/petstore/python/docs/components/schema/number_with_exclusive_min_max.md b/samples/client/petstore/python/docs/components/schema/number_with_exclusive_min_max.md new file mode 100644 index 00000000000..114a1f4d3c9 --- /dev/null +++ b/samples/client/petstore/python/docs/components/schema/number_with_exclusive_min_max.md @@ -0,0 +1,12 @@ +# NumberWithExclusiveMinMax +petstore_api.components.schema.number_with_exclusive_min_max +``` +type: schemas.Schema +``` + +## validate method +Input Type | Return Type | Notes +------------ | ------------- | ------------- +float, int | float, int | + +[[Back to top]](#top) [[Back to Component Schemas]](../../../README.md#Component-Schemas) [[Back to README]](../../../README.md) diff --git a/samples/client/petstore/python/src/petstore_api/components/schema/number_with_exclusive_min_max.py b/samples/client/petstore/python/src/petstore_api/components/schema/number_with_exclusive_min_max.py new file mode 100644 index 00000000000..98c78dd7c6f --- /dev/null +++ b/samples/client/petstore/python/src/petstore_api/components/schema/number_with_exclusive_min_max.py @@ -0,0 +1,29 @@ +# coding: utf-8 + +""" + OpenAPI Petstore + This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: " \ # noqa: E501 + The version of the OpenAPI document: 1.0.0 + Generated by: https://github.com/openapi-json-schema-tools/openapi-json-schema-generator +""" + +from __future__ import annotations +from petstore_api.shared_imports.schema_imports import * # pyright: ignore [reportWildcardImportFromLibrary] + + + +@dataclasses.dataclass(frozen=True) +class NumberWithExclusiveMinMax( + schemas.NumberSchema +): + """NOTE: This class is auto generated by OpenAPI JSON Schema Generator. + Ref: https://github.com/openapi-json-schema-tools/openapi-json-schema-generator + + Do not edit the class manually. + """ + types: typing.FrozenSet[typing.Type] = frozenset({ + float, + int, + }) + exclusive_maximum: typing.Union[int, float] = 12 + exclusive_minimum: typing.Union[int, float] = 10 diff --git a/samples/client/petstore/python/src/petstore_api/components/schemas/__init__.py b/samples/client/petstore/python/src/petstore_api/components/schemas/__init__.py index 6fca9d7e6c6..325e3a54b44 100644 --- a/samples/client/petstore/python/src/petstore_api/components/schemas/__init__.py +++ b/samples/client/petstore/python/src/petstore_api/components/schemas/__init__.py @@ -89,6 +89,7 @@ from petstore_api.components.schema.nullable_string import NullableString from petstore_api.components.schema.number import Number from petstore_api.components.schema.number_only import NumberOnly +from petstore_api.components.schema.number_with_exclusive_min_max import NumberWithExclusiveMinMax from petstore_api.components.schema.number_with_validations import NumberWithValidations from petstore_api.components.schema.obj_with_required_props import ObjWithRequiredProps from petstore_api.components.schema.obj_with_required_props_base import ObjWithRequiredPropsBase diff --git a/samples/client/petstore/python/test/components/schema/test_number_with_exclusive_min_max.py b/samples/client/petstore/python/test/components/schema/test_number_with_exclusive_min_max.py new file mode 100644 index 00000000000..4f3c8cd34b9 --- /dev/null +++ b/samples/client/petstore/python/test/components/schema/test_number_with_exclusive_min_max.py @@ -0,0 +1,25 @@ +# coding: utf-8 + +""" + OpenAPI Petstore + This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: " \ # noqa: E501 + The version of the OpenAPI document: 1.0.0 + Generated by: https://github.com/openapi-json-schema-tools/openapi-json-schema-generator +""" + +import unittest + +import petstore_api +from petstore_api.components.schema.number_with_exclusive_min_max import NumberWithExclusiveMinMax +from petstore_api.configurations import schema_configuration + + +class TestNumberWithExclusiveMinMax(unittest.TestCase): + """NumberWithExclusiveMinMax unit test stubs""" + configuration = schema_configuration.SchemaConfiguration( + disabled_json_schema_keywords={'format'} + ) + + +if __name__ == '__main__': + unittest.main() diff --git a/src/main/resources/java/src/main/java/packagename/components/schemas/SchemaClass/_exclusiveMaximum.hbs b/src/main/resources/java/src/main/java/packagename/components/schemas/SchemaClass/_exclusiveMaximum.hbs index 46c2aa69e4e..83273f80699 100644 --- a/src/main/resources/java/src/main/java/packagename/components/schemas/SchemaClass/_exclusiveMaximum.hbs +++ b/src/main/resources/java/src/main/java/packagename/components/schemas/SchemaClass/_exclusiveMaximum.hbs @@ -1,5 +1,5 @@ {{#if forDocs}} -    new KeywordEntry("exclusiveMaximum", new ExclusiveMaximumValidator({{maximum}})){{#unless @last}},{{/unless}}
+    new KeywordEntry("exclusiveMaximum", new ExclusiveMaximumValidator({{exclusiveMaximum}})){{#unless @last}},{{/unless}}
{{~else}} -new KeywordEntry("exclusiveMaximum", new ExclusiveMaximumValidator({{maximum}})){{#unless @last}},{{/unless}} +new KeywordEntry("exclusiveMaximum", new ExclusiveMaximumValidator({{exclusiveMaximum}})){{#unless @last}},{{/unless}} {{/if}} \ No newline at end of file diff --git a/src/main/resources/java/src/main/java/packagename/components/schemas/SchemaClass/_exclusiveMinimum.hbs b/src/main/resources/java/src/main/java/packagename/components/schemas/SchemaClass/_exclusiveMinimum.hbs index e9e75d84bab..0fb56705da7 100644 --- a/src/main/resources/java/src/main/java/packagename/components/schemas/SchemaClass/_exclusiveMinimum.hbs +++ b/src/main/resources/java/src/main/java/packagename/components/schemas/SchemaClass/_exclusiveMinimum.hbs @@ -1,5 +1,5 @@ {{#if forDocs}} -    new KeywordEntry("exclusiveMinimum", new ExclusiveMinimumValidator({{minimum}})){{#unless @last}},{{/unless}}
+    new KeywordEntry("exclusiveMinimum", new ExclusiveMinimumValidator({{exclusiveMinimum}})){{#unless @last}},{{/unless}}
{{~else}} -new KeywordEntry("exclusiveMinimum", new ExclusiveMinimumValidator({{minimum}})){{#unless @last}},{{/unless}} +new KeywordEntry("exclusiveMinimum", new ExclusiveMinimumValidator({{exclusiveMinimum}})){{#unless @last}},{{/unless}} {{/if}} \ No newline at end of file From 51ff63317b24e8097e21b8944f71a207e8b649bf Mon Sep 17 00:00:00 2001 From: Justin Black Date: Mon, 4 Dec 2023 16:43:49 -0800 Subject: [PATCH 13/15] Fixes java doc --- .../java/docs/components/schemas/NumberWithExclusiveMinMax.md | 2 +- .../client/components/schemas/NumberWithExclusiveMinMax.java | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/samples/client/petstore/java/docs/components/schemas/NumberWithExclusiveMinMax.md b/samples/client/petstore/java/docs/components/schemas/NumberWithExclusiveMinMax.md index 5767f573864..b8e4a87791f 100644 --- a/samples/client/petstore/java/docs/components/schemas/NumberWithExclusiveMinMax.md +++ b/samples/client/petstore/java/docs/components/schemas/NumberWithExclusiveMinMax.md @@ -17,7 +17,7 @@ A schema class that validates payloads ### Field Summary | Modifier and Type | Field and Description | | ----------------- | ---------------------- | -| static LinkedHashMap |keywordToValidator
new LinkedHashMap<>(Map.ofEntries(
    new KeywordEntry("type", new TypeValidator(Set.of(
        Integer.class,
        Long.class,
        Float.class,
        Double.class
    ))),
    new KeywordEntry("exclusiveMaximum", new ExclusiveMaximumValidator()),
    new KeywordEntry("exclusiveMinimum", new ExclusiveMinimumValidator())
)); | +| static LinkedHashMap |keywordToValidator
new LinkedHashMap<>(Map.ofEntries(
    new KeywordEntry("type", new TypeValidator(Set.of(
        Integer.class,
        Long.class,
        Float.class,
        Double.class
    ))),
    new KeywordEntry("exclusiveMaximum", new ExclusiveMaximumValidator(12)),
    new KeywordEntry("exclusiveMinimum", new ExclusiveMinimumValidator(10))
)); | ### Method Summary | Modifier and Type | Method and Description | diff --git a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/schemas/NumberWithExclusiveMinMax.java b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/schemas/NumberWithExclusiveMinMax.java index 3712cfe1304..18eed901ca4 100644 --- a/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/schemas/NumberWithExclusiveMinMax.java +++ b/samples/client/petstore/java/src/main/java/org/openapijsonschematools/client/components/schemas/NumberWithExclusiveMinMax.java @@ -29,8 +29,8 @@ public static class NumberWithExclusiveMinMax1 extends JsonSchema { Float.class, Double.class ))), - new KeywordEntry("exclusiveMaximum", new ExclusiveMaximumValidator()), - new KeywordEntry("exclusiveMinimum", new ExclusiveMinimumValidator()) + new KeywordEntry("exclusiveMaximum", new ExclusiveMaximumValidator(12)), + new KeywordEntry("exclusiveMinimum", new ExclusiveMinimumValidator(10)) )); public static int validate(int arg, SchemaConfiguration configuration) throws ValidationException { return JsonSchema.validateInt(NumberWithExclusiveMinMax1.class, arg, configuration); From 368b40ab3c8cfdbbc8b8315e3a766c6abb4463ca Mon Sep 17 00:00:00 2001 From: Justin Black Date: Mon, 4 Dec 2023 18:07:03 -0800 Subject: [PATCH 14/15] Adds java tests --- .../generators/DefaultGeneratorTest.java | 184 +++++++++++++++++- .../resources/3_0/exclusiveMaximum300.yaml | 21 ++ .../resources/3_0/exclusiveMaximum310.yaml | 14 ++ .../resources/3_0/exclusiveMinimum300.yaml | 21 ++ .../resources/3_0/exclusiveMinimum303.yaml | 21 ++ .../resources/3_0/exclusiveMinimum310.yaml | 14 ++ 6 files changed, 274 insertions(+), 1 deletion(-) create mode 100644 src/test/resources/3_0/exclusiveMaximum300.yaml create mode 100644 src/test/resources/3_0/exclusiveMaximum310.yaml create mode 100644 src/test/resources/3_0/exclusiveMinimum300.yaml create mode 100644 src/test/resources/3_0/exclusiveMinimum303.yaml create mode 100644 src/test/resources/3_0/exclusiveMinimum310.yaml diff --git a/src/test/java/org/openapijsonschematools/codegen/generators/DefaultGeneratorTest.java b/src/test/java/org/openapijsonschematools/codegen/generators/DefaultGeneratorTest.java index c0830a969ed..a2d2a8dc5f1 100644 --- a/src/test/java/org/openapijsonschematools/codegen/generators/DefaultGeneratorTest.java +++ b/src/test/java/org/openapijsonschematools/codegen/generators/DefaultGeneratorTest.java @@ -3945,7 +3945,189 @@ public void testMapValueSchemaTypes() { assertEquals(schema.mapValueSchema.types, expectedTypes); } - + @Test + public void testExclusiveMinimum300() { + final OpenAPI openAPI = TestUtils.parseFlattenSpec("src/test/resources/3_0/exclusiveMinimum300.yaml"); + final DefaultGenerator codegen = new DefaultGenerator(); + codegen.setOpenAPI(openAPI); + String schemaPrefix = "#/components/schemas/"; + + String schemaName; + CodegenSchema schema; + + schemaName = "AnyTypeWithExclusiveMinimumTrue"; + schema = codegen.fromSchema( + codegen.openAPI.getComponents().getSchemas().get(schemaName), + schemaPrefix + schemaName, + schemaPrefix + schemaName); + assertEquals(schema.minimum, null); + assertEquals(schema.exclusiveMinimum, new BigDecimal(10)); + + schemaName = "NumberWithExclusiveMinimumTrue"; + schema = codegen.fromSchema( + codegen.openAPI.getComponents().getSchemas().get(schemaName), + schemaPrefix + schemaName, + schemaPrefix + schemaName); + assertEquals(schema.minimum, null); + assertEquals(schema.exclusiveMinimum, new BigDecimal(10)); + + schemaName = "AnyTypeWithExclusiveMinimumFalse"; + schema = codegen.fromSchema( + codegen.openAPI.getComponents().getSchemas().get(schemaName), + schemaPrefix + schemaName, + schemaPrefix + schemaName); + assertEquals(schema.minimum, new BigDecimal(10)); + assertEquals(schema.exclusiveMinimum, null); + + schemaName = "NumberWithExclusiveMinimumFalse"; + schema = codegen.fromSchema( + codegen.openAPI.getComponents().getSchemas().get(schemaName), + schemaPrefix + schemaName, + schemaPrefix + schemaName); + assertEquals(schema.minimum, new BigDecimal(10)); + assertEquals(schema.exclusiveMinimum, null); + } + + @Test + public void testExclusiveMinimum303() { + final OpenAPI openAPI = TestUtils.parseFlattenSpec("src/test/resources/3_0/exclusiveMinimum303.yaml"); + final DefaultGenerator codegen = new DefaultGenerator(); + codegen.setOpenAPI(openAPI); + String schemaPrefix = "#/components/schemas/"; + + String schemaName; + CodegenSchema schema; + + schemaName = "AnyTypeWithExclusiveMinimumTrue"; + schema = codegen.fromSchema( + codegen.openAPI.getComponents().getSchemas().get(schemaName), + schemaPrefix + schemaName, + schemaPrefix + schemaName); + assertEquals(schema.minimum, null); + assertEquals(schema.exclusiveMinimum, new BigDecimal(10)); + + schemaName = "NumberWithExclusiveMinimumTrue"; + schema = codegen.fromSchema( + codegen.openAPI.getComponents().getSchemas().get(schemaName), + schemaPrefix + schemaName, + schemaPrefix + schemaName); + assertEquals(schema.minimum, null); + assertEquals(schema.exclusiveMinimum, new BigDecimal(10)); + + schemaName = "AnyTypeWithExclusiveMinimumFalse"; + schema = codegen.fromSchema( + codegen.openAPI.getComponents().getSchemas().get(schemaName), + schemaPrefix + schemaName, + schemaPrefix + schemaName); + assertEquals(schema.minimum, new BigDecimal(10)); + assertEquals(schema.exclusiveMinimum, null); + + schemaName = "NumberWithExclusiveMinimumFalse"; + schema = codegen.fromSchema( + codegen.openAPI.getComponents().getSchemas().get(schemaName), + schemaPrefix + schemaName, + schemaPrefix + schemaName); + assertEquals(schema.minimum, new BigDecimal(10)); + assertEquals(schema.exclusiveMinimum, null); + } + + @Test + public void testExclusiveMinimum310() { + final OpenAPI openAPI = TestUtils.parseFlattenSpec("src/test/resources/3_0/exclusiveMinimum310.yaml"); + final DefaultGenerator codegen = new DefaultGenerator(); + codegen.setOpenAPI(openAPI); + String schemaPrefix = "#/components/schemas/"; + + String schemaName; + CodegenSchema schema; + + schemaName = "AnyTypeWithExclusiveMinimum"; + schema = codegen.fromSchema( + codegen.openAPI.getComponents().getSchemas().get(schemaName), + schemaPrefix + schemaName, + schemaPrefix + schemaName); + assertEquals(schema.minimum, new BigDecimal(10)); + assertEquals(schema.exclusiveMinimum, new BigDecimal(11)); + + schemaName = "NumberWithExclusiveMinimum"; + schema = codegen.fromSchema( + codegen.openAPI.getComponents().getSchemas().get(schemaName), + schemaPrefix + schemaName, + schemaPrefix + schemaName); + assertEquals(schema.minimum, new BigDecimal(10)); + assertEquals(schema.exclusiveMinimum, new BigDecimal(11)); + } + + @Test + public void testExclusiveMaximum300() { + final OpenAPI openAPI = TestUtils.parseFlattenSpec("src/test/resources/3_0/exclusiveMaximum300.yaml"); + final DefaultGenerator codegen = new DefaultGenerator(); + codegen.setOpenAPI(openAPI); + String schemaPrefix = "#/components/schemas/"; + + String schemaName; + CodegenSchema schema; + + schemaName = "AnyTypeWithExclusiveMaximumTrue"; + schema = codegen.fromSchema( + codegen.openAPI.getComponents().getSchemas().get(schemaName), + schemaPrefix + schemaName, + schemaPrefix + schemaName); + assertEquals(schema.maximum, null); + assertEquals(schema.exclusiveMaximum, new BigDecimal(10)); + + schemaName = "NumberWithExclusiveMaximumTrue"; + schema = codegen.fromSchema( + codegen.openAPI.getComponents().getSchemas().get(schemaName), + schemaPrefix + schemaName, + schemaPrefix + schemaName); + assertEquals(schema.maximum, null); + assertEquals(schema.exclusiveMaximum, new BigDecimal(10)); + + schemaName = "AnyTypeWithExclusiveMaximumFalse"; + schema = codegen.fromSchema( + codegen.openAPI.getComponents().getSchemas().get(schemaName), + schemaPrefix + schemaName, + schemaPrefix + schemaName); + assertEquals(schema.maximum, new BigDecimal(10)); + assertEquals(schema.exclusiveMaximum, null); + + schemaName = "NumberWithExclusiveMaximumFalse"; + schema = codegen.fromSchema( + codegen.openAPI.getComponents().getSchemas().get(schemaName), + schemaPrefix + schemaName, + schemaPrefix + schemaName); + assertEquals(schema.maximum, new BigDecimal(10)); + assertEquals(schema.exclusiveMaximum, null); + } + + @Test + public void testExclusiveMaximum310() { + final OpenAPI openAPI = TestUtils.parseFlattenSpec("src/test/resources/3_0/exclusiveMaximum310.yaml"); + final DefaultGenerator codegen = new DefaultGenerator(); + codegen.setOpenAPI(openAPI); + String schemaPrefix = "#/components/schemas/"; + + String schemaName; + CodegenSchema schema; + + schemaName = "AnyTypeWithExclusiveMaximum"; + schema = codegen.fromSchema( + codegen.openAPI.getComponents().getSchemas().get(schemaName), + schemaPrefix + schemaName, + schemaPrefix + schemaName); + assertEquals(schema.maximum, new BigDecimal(10)); + assertEquals(schema.exclusiveMaximum, new BigDecimal(11)); + + schemaName = "NumberWithExclusiveMaximum"; + schema = codegen.fromSchema( + codegen.openAPI.getComponents().getSchemas().get(schemaName), + schemaPrefix + schemaName, + schemaPrefix + schemaName); + assertEquals(schema.maximum, new BigDecimal(10)); + assertEquals(schema.exclusiveMaximum, new BigDecimal(11)); + } + public static class FromParameter { private CodegenParameter codegenParameter(String path) { final OpenAPI openAPI = TestUtils.parseFlattenSpec("src/test/resources/3_0/fromParameter.yaml"); diff --git a/src/test/resources/3_0/exclusiveMaximum300.yaml b/src/test/resources/3_0/exclusiveMaximum300.yaml new file mode 100644 index 00000000000..dfc22250f0a --- /dev/null +++ b/src/test/resources/3_0/exclusiveMaximum300.yaml @@ -0,0 +1,21 @@ +openapi: 3.0.0 +info: + title: exclusiveMaximum test + version: 1.0.0 +paths: {} +components: + schemas: + AnyTypeWithExclusiveMaximumTrue: + exclusiveMaximum: true + maximum: 10 + NumberWithExclusiveMaximumTrue: + type: number + exclusiveMaximum: true + maximum: 10 + AnyTypeWithExclusiveMaximumFalse: + exclusiveMaximum: false + maximum: 10 + NumberWithExclusiveMaximumFalse: + type: number + exclusiveMaximum: false + maximum: 10 \ No newline at end of file diff --git a/src/test/resources/3_0/exclusiveMaximum310.yaml b/src/test/resources/3_0/exclusiveMaximum310.yaml new file mode 100644 index 00000000000..8aecf2346e6 --- /dev/null +++ b/src/test/resources/3_0/exclusiveMaximum310.yaml @@ -0,0 +1,14 @@ +openapi: 3.1.0 +info: + title: exclusiveMaximum test + version: 1.0.0 +paths: {} +components: + schemas: + AnyTypeWithExclusiveMaximum: + exclusiveMaximum: 11 + maximum: 10 + NumberWithExclusiveMaximum: + type: number + exclusiveMaximum: 11 + maximum: 10 \ No newline at end of file diff --git a/src/test/resources/3_0/exclusiveMinimum300.yaml b/src/test/resources/3_0/exclusiveMinimum300.yaml new file mode 100644 index 00000000000..0782d1d0f64 --- /dev/null +++ b/src/test/resources/3_0/exclusiveMinimum300.yaml @@ -0,0 +1,21 @@ +openapi: 3.0.0 +info: + title: exclusiveMinimum test + version: 1.0.0 +paths: {} +components: + schemas: + AnyTypeWithExclusiveMinimumTrue: + exclusiveMinimum: true + minimum: 10 + NumberWithExclusiveMinimumTrue: + type: number + exclusiveMinimum: true + minimum: 10 + AnyTypeWithExclusiveMinimumFalse: + exclusiveMinimum: false + minimum: 10 + NumberWithExclusiveMinimumFalse: + type: number + exclusiveMinimum: false + minimum: 10 \ No newline at end of file diff --git a/src/test/resources/3_0/exclusiveMinimum303.yaml b/src/test/resources/3_0/exclusiveMinimum303.yaml new file mode 100644 index 00000000000..77d64d2f7cb --- /dev/null +++ b/src/test/resources/3_0/exclusiveMinimum303.yaml @@ -0,0 +1,21 @@ +openapi: 3.0.3 +info: + title: exclusiveMinimum test + version: 1.0.0 +paths: {} +components: + schemas: + AnyTypeWithExclusiveMinimumTrue: + exclusiveMinimum: true + minimum: 10 + NumberWithExclusiveMinimumTrue: + type: number + exclusiveMinimum: true + minimum: 10 + AnyTypeWithExclusiveMinimumFalse: + exclusiveMinimum: false + minimum: 10 + NumberWithExclusiveMinimumFalse: + type: number + exclusiveMinimum: false + minimum: 10 \ No newline at end of file diff --git a/src/test/resources/3_0/exclusiveMinimum310.yaml b/src/test/resources/3_0/exclusiveMinimum310.yaml new file mode 100644 index 00000000000..7ce56dec147 --- /dev/null +++ b/src/test/resources/3_0/exclusiveMinimum310.yaml @@ -0,0 +1,14 @@ +openapi: 3.1.0 +info: + title: exclusiveMinimum test + version: 1.0.0 +paths: {} +components: + schemas: + AnyTypeWithExclusiveMinimum: + exclusiveMinimum: 11 + minimum: 10 + NumberWithExclusiveMinimum: + type: number + exclusiveMinimum: 11 + minimum: 10 \ No newline at end of file From 5c444aaa8e0bec831cb41d55370dee0121f67f9f Mon Sep 17 00:00:00 2001 From: Justin Black Date: Mon, 4 Dec 2023 18:13:02 -0800 Subject: [PATCH 15/15] Sample regen --- samples/client/petstore/python/.openapi-generator/FILES | 1 - 1 file changed, 1 deletion(-) diff --git a/samples/client/petstore/python/.openapi-generator/FILES b/samples/client/petstore/python/.openapi-generator/FILES index 4b805fb931d..5ba6ce35185 100644 --- a/samples/client/petstore/python/.openapi-generator/FILES +++ b/samples/client/petstore/python/.openapi-generator/FILES @@ -1595,5 +1595,4 @@ test-requirements.txt test/__init__.py test/components/__init__.py test/components/schema/__init__.py -test/components/schema/test_number_with_exclusive_min_max.py tox.ini