From 9f3509798a336ebfb8d5e4fec534027bd19690b8 Mon Sep 17 00:00:00 2001 From: Bernie Schelberg Date: Fri, 28 Oct 2022 12:16:36 +1000 Subject: [PATCH 01/12] Fix #12412 Use enum type for discriminator --- .../openapitools/codegen/DefaultCodegen.java | 12 ++++- .../codegen/DefaultCodegenTest.java | 7 +++ .../java/spring/SpringCodegenTest.java | 49 +++++++++++++++++++ .../resources/3_0/oneOfDiscriminator.yaml | 31 ++++++++++++ 4 files changed, 97 insertions(+), 2 deletions(-) diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java index e9579cd82223..a8be7622d59a 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java @@ -3385,8 +3385,16 @@ protected CodegenDiscriminator createDiscriminator(String schemaName, Schema sch discriminator.setPropertyBaseName(sourceDiscriminator.getPropertyName()); discriminator.setPropertyGetter(toGetter(discriminator.getPropertyName())); - // FIXME: for now, we assume that the discriminator property is String - discriminator.setPropertyType(typeMapping.get("string")); + // FIXME: there are other ways to define the type of the discriminator property (inline + // for example). Handling those scenarios is too complicated for me, I'm leaving it for + // the future.. + String propertyType = + Optional.ofNullable(schema.getProperties()) + .map(p -> (Schema) p.get(discPropName)) + .map(Schema::get$ref) + .map(ModelUtils::getSimpleRef) + .orElseGet(() -> typeMapping.get("string")); + discriminator.setPropertyType(propertyType); // check to see if the discriminator property is an enum string if (schema.getProperties() != null && diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/DefaultCodegenTest.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/DefaultCodegenTest.java index cfdc60aa0aa5..b13096ce0fd8 100644 --- a/modules/openapi-generator/src/test/java/org/openapitools/codegen/DefaultCodegenTest.java +++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/DefaultCodegenTest.java @@ -54,6 +54,7 @@ import java.util.*; import java.util.stream.Collectors; +import static org.assertj.core.api.Assertions.assertThat; import static org.testng.Assert.*; @@ -1447,6 +1448,12 @@ public void testComposedSchemaOneOfDiscriminatorMap() { hs.add(new CodegenDiscriminator.MappedModel(mn, mn)); Assert.assertEquals(cm.discriminator.getMappedModels(), hs); + // ref oneOf models with enum property discriminator + modelName = "FruitOneOfEnumMappingDisc"; + sc = openAPI.getComponents().getSchemas().get(modelName); + cm = codegen.fromModel(modelName, sc); + assertThat(cm.discriminator.getPropertyType()).isEqualTo("FruitTypeEnum"); + // ref oneOf models with discriminator in the grandparent schemas of those oneof models modelName = "FruitGrandparentDisc"; sc = openAPI.getComponents().getSchemas().get(modelName); diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/spring/SpringCodegenTest.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/spring/SpringCodegenTest.java index ac1f12a3eb0f..54064621c48c 100644 --- a/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/spring/SpringCodegenTest.java +++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/spring/SpringCodegenTest.java @@ -1079,6 +1079,55 @@ public void testOneOfAndAllOf() throws IOException { assertFileContains(Paths.get(outputPath + "/src/main/java/org/openapitools/model/PizzaSpeziale.java"), "import java.math.BigDecimal"); } + @Test + void testOneOfWithEnumDiscriminator() throws IOException { + File output = Files.createTempDirectory("test").toFile().getCanonicalFile(); + output.deleteOnExit(); + String outputPath = output.getAbsolutePath().replace('\\', '/'); + OpenAPI openAPI = new OpenAPIParser() + .readLocation("src/test/resources/3_0/oneOfDiscriminator.yaml", null, new ParseOptions()).getOpenAPI(); + + SpringCodegen codegen = new SpringCodegen(); + codegen.setOutputDir(output.getAbsolutePath()); + codegen.additionalProperties().put(CXFServerFeatures.LOAD_TEST_DATA_FROM_FILE, "true"); + codegen.setUseOneOfInterfaces(true); + + ClientOptInput input = new ClientOptInput(); + input.openAPI(openAPI); + input.config(codegen); + + DefaultGenerator generator = new DefaultGenerator(); + codegen.setHateoas(true); + generator.setGeneratorPropertyDefault(CodegenConstants.MODELS, "true"); + //generator.setGeneratorPropertyDefault(CodegenConstants.USE_ONEOF_DISCRIMINATOR_LOOKUP, "true"); + generator.setGeneratorPropertyDefault(CodegenConstants.LEGACY_DISCRIMINATOR_BEHAVIOR, "false"); + + codegen.setUseOneOfInterfaces(true); + codegen.setLegacyDiscriminatorBehavior(false); + + generator.setGeneratorPropertyDefault(CodegenConstants.MODEL_TESTS, "false"); + generator.setGeneratorPropertyDefault(CodegenConstants.MODEL_DOCS, "false"); + generator.setGeneratorPropertyDefault(CodegenConstants.APIS, "true"); + generator.setGeneratorPropertyDefault(CodegenConstants.SUPPORTING_FILES, "false"); + + generator.opts(input).generate(); + + assertFileContains( + Paths.get(outputPath + "/src/main/java/org/openapitools/model/FruitOneOfEnumMappingDisc.java"), + "public FruitTypeEnum getFruitType();" + ); + assertFileContains( + Paths.get(outputPath + "/src/main/java/org/openapitools/model/AppleOneOfEnumMappingDisc.java"), + "private FruitTypeEnum fruitType;", + "public FruitTypeEnum getFruitType() {" + ); + assertFileContains( + Paths.get(outputPath + "/src/main/java/org/openapitools/model/BananaOneOfEnumMappingDisc.java"), + "private FruitTypeEnum fruitType;", + "public FruitTypeEnum getFruitType() {" + ); + } + @Test public void testTypeMappings() { final SpringCodegen codegen = new SpringCodegen(); diff --git a/modules/openapi-generator/src/test/resources/3_0/oneOfDiscriminator.yaml b/modules/openapi-generator/src/test/resources/3_0/oneOfDiscriminator.yaml index e9a342980749..2442a030a597 100644 --- a/modules/openapi-generator/src/test/resources/3_0/oneOfDiscriminator.yaml +++ b/modules/openapi-generator/src/test/resources/3_0/oneOfDiscriminator.yaml @@ -170,6 +170,37 @@ components: type: integer oneOf: - $ref: '#/components/schemas/FruitType' + FruitTypeEnum: + type: string + enum: [APPLE, BANANA] + FruitOneOfEnumMappingDisc: + type: object + properties: + fruitType: + $ref: "#/components/schemas/FruitTypeEnum" + required: fruitType + oneOf: + - $ref: '#/components/schemas/AppleOneOfEnumMappingDisc' + - $ref: '#/components/schemas/BananaOneOfEnumMappingDisc' + discriminator: + propertyName: fruitType + mapping: + APPLE: '#/components/schemas/AppleOneOfEnumMappingDisc' + BANANA: '#/components/schemas/BananaOneOfEnumMappingDisc' + AppleOneOfEnumMappingDisc: + type: object + required: + - seeds + properties: + seeds: + type: integer + BananaOneOfEnumMappingDisc: + type: object + required: + - length + properties: + length: + type: integer FruitGrandparentDisc: oneOf: - $ref: '#/components/schemas/AppleGrandparentDisc' From 74093a70b02d9fa460ecd8cb3648b86807f97809 Mon Sep 17 00:00:00 2001 From: Bernie Schelberg Date: Thu, 3 Nov 2022 09:10:51 +1000 Subject: [PATCH 02/12] Rename variable --- .../org/openapitools/codegen/DefaultCodegen.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java index a8be7622d59a..64da67f59abf 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java @@ -3380,8 +3380,8 @@ protected CodegenDiscriminator createDiscriminator(String schemaName, Schema sch return null; } CodegenDiscriminator discriminator = new CodegenDiscriminator(); - String discPropName = sourceDiscriminator.getPropertyName(); - discriminator.setPropertyName(toVarName(discPropName)); + String discriminatorPropertyName = sourceDiscriminator.getPropertyName(); + discriminator.setPropertyName(toVarName(discriminatorPropertyName)); discriminator.setPropertyBaseName(sourceDiscriminator.getPropertyName()); discriminator.setPropertyGetter(toGetter(discriminator.getPropertyName())); @@ -3390,7 +3390,7 @@ protected CodegenDiscriminator createDiscriminator(String schemaName, Schema sch // the future.. String propertyType = Optional.ofNullable(schema.getProperties()) - .map(p -> (Schema) p.get(discPropName)) + .map(p -> (Schema) p.get(discriminatorPropertyName)) .map(Schema::get$ref) .map(ModelUtils::getSimpleRef) .orElseGet(() -> typeMapping.get("string")); @@ -3398,8 +3398,8 @@ protected CodegenDiscriminator createDiscriminator(String schemaName, Schema sch // check to see if the discriminator property is an enum string if (schema.getProperties() != null && - schema.getProperties().get(discPropName) instanceof StringSchema) { - StringSchema s = (StringSchema) schema.getProperties().get(discPropName); + schema.getProperties().get(discriminatorPropertyName) instanceof StringSchema) { + StringSchema s = (StringSchema) schema.getProperties().get(discriminatorPropertyName); if (s.getEnum() != null && !s.getEnum().isEmpty()) { // it's an enum string discriminator.setIsEnum(true); } @@ -3443,7 +3443,7 @@ protected CodegenDiscriminator createDiscriminator(String schemaName, Schema sch } // if there are composed oneOf/anyOf schemas, add them to this discriminator if (ModelUtils.isComposedSchema(schema) && !this.getLegacyDiscriminatorBehavior()) { - List otherDescendants = getOneOfAnyOfDescendants(schemaName, discPropName, (ComposedSchema) schema, openAPI); + List otherDescendants = getOneOfAnyOfDescendants(schemaName, discriminatorPropertyName, (ComposedSchema) schema, openAPI); for (MappedModel otherDescendant : otherDescendants) { if (!uniqueDescendants.contains(otherDescendant)) { uniqueDescendants.add(otherDescendant); From d53f07f6d5544819287c61f89a273807b91c2702 Mon Sep 17 00:00:00 2001 From: Bernie Schelberg Date: Mon, 7 Nov 2022 21:21:48 +1000 Subject: [PATCH 03/12] Fix required property in test resource --- .../src/test/resources/3_0/oneOfDiscriminator.yaml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/openapi-generator/src/test/resources/3_0/oneOfDiscriminator.yaml b/modules/openapi-generator/src/test/resources/3_0/oneOfDiscriminator.yaml index 2442a030a597..49bcc3ab60d3 100644 --- a/modules/openapi-generator/src/test/resources/3_0/oneOfDiscriminator.yaml +++ b/modules/openapi-generator/src/test/resources/3_0/oneOfDiscriminator.yaml @@ -178,7 +178,8 @@ components: properties: fruitType: $ref: "#/components/schemas/FruitTypeEnum" - required: fruitType + required: + - fruitType oneOf: - $ref: '#/components/schemas/AppleOneOfEnumMappingDisc' - $ref: '#/components/schemas/BananaOneOfEnumMappingDisc' From 0cf0de7b8c07a37316036ac0ae7aa0d370cf4ecd Mon Sep 17 00:00:00 2001 From: Bernie Schelberg Date: Mon, 7 Nov 2022 21:42:05 +1000 Subject: [PATCH 04/12] Add example of enum mapping to samples --- .../oneof_polymorphism_and_inheritance.yaml | 18 ++ .../.openapi-generator/FILES | 6 + .../README.md | 2 + .../doc/FooRefOrValueEnumMapping.md | 20 ++ .../doc/RefOrValueEnum.md | 14 ++ .../lib/openapi.dart | 2 + .../model/foo_ref_or_value_enum_mapping.dart | 171 ++++++++++++++++++ .../lib/src/model/ref_or_value_enum.dart | 36 ++++ .../lib/src/serializers.dart | 4 + .../foo_ref_or_value_enum_mapping_test.dart | 46 +++++ .../test/ref_or_value_enum_test.dart | 9 + .../.openapi-generator/FILES | 2 + .../main/java/org/openapitools/model/Foo.java | 28 ++- .../java/org/openapitools/model/FooRef.java | 28 ++- .../model/FooRefOrValueEnumMapping.java | 39 ++++ .../openapitools/model/RefOrValueEnum.java | 56 ++++++ .../src/main/resources/openapi.yaml | 21 +++ 17 files changed, 498 insertions(+), 4 deletions(-) create mode 100644 samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/doc/FooRefOrValueEnumMapping.md create mode 100644 samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/doc/RefOrValueEnum.md create mode 100644 samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/lib/src/model/foo_ref_or_value_enum_mapping.dart create mode 100644 samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/lib/src/model/ref_or_value_enum.dart create mode 100644 samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/test/foo_ref_or_value_enum_mapping_test.dart create mode 100644 samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/test/ref_or_value_enum_test.dart create mode 100644 samples/openapi3/server/petstore/spring-boot-oneof/src/main/java/org/openapitools/model/FooRefOrValueEnumMapping.java create mode 100644 samples/openapi3/server/petstore/spring-boot-oneof/src/main/java/org/openapitools/model/RefOrValueEnum.java diff --git a/modules/openapi-generator/src/test/resources/3_0/oneof_polymorphism_and_inheritance.yaml b/modules/openapi-generator/src/test/resources/3_0/oneof_polymorphism_and_inheritance.yaml index dc916b1ee21e..ab469d5cf199 100644 --- a/modules/openapi-generator/src/test/resources/3_0/oneof_polymorphism_and_inheritance.yaml +++ b/modules/openapi-generator/src/test/resources/3_0/oneof_polymorphism_and_inheritance.yaml @@ -105,6 +105,24 @@ components: - $ref: "#/components/schemas/FooRef" discriminator: propertyName: "@type" + RefOrValueEnum: + type: string + enum: [REF, VALUE] + FooRefOrValueEnumMapping: + type: object + properties: + objectType: + $ref: "#/components/schemas/RefOrValueEnum" + required: + - objectType + oneOf: + - $ref: "#/components/schemas/Foo" + - $ref: "#/components/schemas/FooRef" + discriminator: + propertyName: "objectType" + mapping: + VALUE: "#/components/schemas/Foo" + REF: "#/components/schemas/FooRef" Foo: type: object properties: diff --git a/samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/.openapi-generator/FILES b/samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/.openapi-generator/FILES index 52a900a19623..8c9d717e6f9a 100644 --- a/samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/.openapi-generator/FILES +++ b/samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/.openapi-generator/FILES @@ -14,9 +14,11 @@ doc/Foo.md doc/FooApi.md doc/FooRef.md doc/FooRefOrValue.md +doc/FooRefOrValueEnumMapping.md doc/Pasta.md doc/Pizza.md doc/PizzaSpeziale.md +doc/RefOrValueEnum.md lib/openapi.dart lib/src/api.dart lib/src/api/bar_api.dart @@ -40,8 +42,12 @@ lib/src/model/extensible.dart lib/src/model/foo.dart lib/src/model/foo_ref.dart lib/src/model/foo_ref_or_value.dart +lib/src/model/foo_ref_or_value_enum_mapping.dart lib/src/model/pasta.dart lib/src/model/pizza.dart lib/src/model/pizza_speziale.dart +lib/src/model/ref_or_value_enum.dart lib/src/serializers.dart pubspec.yaml +test/foo_ref_or_value_enum_mapping_test.dart +test/ref_or_value_enum_test.dart diff --git a/samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/README.md b/samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/README.md index 6a3fea771a12..96d08b435938 100644 --- a/samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/README.md +++ b/samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/README.md @@ -83,9 +83,11 @@ Class | Method | HTTP request | Description - [Foo](doc/Foo.md) - [FooRef](doc/FooRef.md) - [FooRefOrValue](doc/FooRefOrValue.md) + - [FooRefOrValueEnumMapping](doc/FooRefOrValueEnumMapping.md) - [Pasta](doc/Pasta.md) - [Pizza](doc/Pizza.md) - [PizzaSpeziale](doc/PizzaSpeziale.md) + - [RefOrValueEnum](doc/RefOrValueEnum.md) ## Documentation For Authorization diff --git a/samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/doc/FooRefOrValueEnumMapping.md b/samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/doc/FooRefOrValueEnumMapping.md new file mode 100644 index 000000000000..9e2bafba4a9f --- /dev/null +++ b/samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/doc/FooRefOrValueEnumMapping.md @@ -0,0 +1,20 @@ +# openapi.model.FooRefOrValueEnumMapping + +## Load the model package +```dart +import 'package:openapi/api.dart'; +``` + +## Properties +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**objectType** | [**RefOrValueEnum**](RefOrValueEnum.md) | | +**href** | **String** | Hyperlink reference | [optional] +**id** | **String** | unique identifier | [optional] +**atSchemaLocation** | **String** | A URI to a JSON-Schema file that defines additional attributes and relationships | [optional] +**atBaseType** | **String** | When sub-classing, this defines the super-class | [optional] +**atType** | **String** | When sub-classing, this defines the sub-class Extensible name | + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/doc/RefOrValueEnum.md b/samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/doc/RefOrValueEnum.md new file mode 100644 index 000000000000..41754876638a --- /dev/null +++ b/samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/doc/RefOrValueEnum.md @@ -0,0 +1,14 @@ +# openapi.model.RefOrValueEnum + +## Load the model package +```dart +import 'package:openapi/api.dart'; +``` + +## Properties +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/lib/openapi.dart b/samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/lib/openapi.dart index ea87a7cb4761..6a0c9e7f258d 100644 --- a/samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/lib/openapi.dart +++ b/samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/lib/openapi.dart @@ -23,6 +23,8 @@ export 'package:openapi/src/model/extensible.dart'; export 'package:openapi/src/model/foo.dart'; export 'package:openapi/src/model/foo_ref.dart'; export 'package:openapi/src/model/foo_ref_or_value.dart'; +export 'package:openapi/src/model/foo_ref_or_value_enum_mapping.dart'; export 'package:openapi/src/model/pasta.dart'; export 'package:openapi/src/model/pizza.dart'; export 'package:openapi/src/model/pizza_speziale.dart'; +export 'package:openapi/src/model/ref_or_value_enum.dart'; diff --git a/samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/lib/src/model/foo_ref_or_value_enum_mapping.dart b/samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/lib/src/model/foo_ref_or_value_enum_mapping.dart new file mode 100644 index 000000000000..949ecde2eea5 --- /dev/null +++ b/samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/lib/src/model/foo_ref_or_value_enum_mapping.dart @@ -0,0 +1,171 @@ +// +// AUTO-GENERATED FILE, DO NOT MODIFY! +// + +// ignore_for_file: unused_element +import 'package:openapi/src/model/foo.dart'; +import 'package:openapi/src/model/ref_or_value_enum.dart'; +import 'package:openapi/src/model/foo_ref.dart'; +import 'package:built_value/built_value.dart'; +import 'package:built_value/serializer.dart'; +import 'package:one_of/one_of.dart'; + +part 'foo_ref_or_value_enum_mapping.g.dart'; + +/// FooRefOrValueEnumMapping +/// +/// Properties: +/// * [objectType] +/// * [href] - Hyperlink reference +/// * [id] - unique identifier +/// * [atSchemaLocation] - A URI to a JSON-Schema file that defines additional attributes and relationships +/// * [atBaseType] - When sub-classing, this defines the super-class +/// * [atType] - When sub-classing, this defines the sub-class Extensible name +@BuiltValue() +abstract class FooRefOrValueEnumMapping implements Built { + @BuiltValueField(wireName: r'objectType') + RefOrValueEnum get objectType; + // enum objectTypeEnum { REF, VALUE, }; + + /// One Of [Foo], [FooRef] + OneOf get oneOf; + + static const String discriminatorFieldName = r'objectType'; + + static const Map discriminatorMapping = { + r'Foo': Foo, + r'FooRef': FooRef, + r'REF': FooRef, + r'VALUE': Foo, + }; + + FooRefOrValueEnumMapping._(); + + factory FooRefOrValueEnumMapping([void updates(FooRefOrValueEnumMappingBuilder b)]) = _$FooRefOrValueEnumMapping; + + @BuiltValueHook(initializeBuilder: true) + static void _defaults(FooRefOrValueEnumMappingBuilder b) => b; + + @BuiltValueSerializer(custom: true) + static Serializer get serializer => _$FooRefOrValueEnumMappingSerializer(); +} + +class _$FooRefOrValueEnumMappingSerializer implements PrimitiveSerializer { + @override + final Iterable types = const [FooRefOrValueEnumMapping, _$FooRefOrValueEnumMapping]; + + @override + final String wireName = r'FooRefOrValueEnumMapping'; + + Iterable _serializeProperties( + Serializers serializers, + FooRefOrValueEnumMapping object, { + FullType specifiedType = FullType.unspecified, + }) sync* { + yield r'objectType'; + yield serializers.serialize( + object.objectType, + specifiedType: const FullType(RefOrValueEnum), + ); + } + + @override + Object serialize( + Serializers serializers, + FooRefOrValueEnumMapping object, { + FullType specifiedType = FullType.unspecified, + }) { + final oneOf = object.oneOf; + final result = _serializeProperties(serializers, object, specifiedType: specifiedType).toList(); + result.addAll(serializers.serialize(oneOf.value, specifiedType: FullType(oneOf.valueType)) as Iterable); + return result; + } + + void _deserializeProperties( + Serializers serializers, + Object serialized, { + FullType specifiedType = FullType.unspecified, + required List serializedList, + required FooRefOrValueEnumMappingBuilder result, + required List unhandled, + }) { + for (var i = 0; i < serializedList.length; i += 2) { + final key = serializedList[i] as String; + final value = serializedList[i + 1]; + switch (key) { + case r'objectType': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType(RefOrValueEnum), + ) as RefOrValueEnum; + result.objectType = valueDes; + break; + default: + unhandled.add(key); + unhandled.add(value); + break; + } + } + } + + @override + FooRefOrValueEnumMapping deserialize( + Serializers serializers, + Object serialized, { + FullType specifiedType = FullType.unspecified, + }) { + final result = FooRefOrValueEnumMappingBuilder(); + Object? oneOfDataSrc; + final serializedList = (serialized as Iterable).toList(); + final discIndex = serializedList.indexOf(FooRefOrValueEnumMapping.discriminatorFieldName) + 1; + final discValue = serializers.deserialize(serializedList[discIndex], specifiedType: FullType(String)) as String; + final unhandled = []; + _deserializeProperties( + serializers, + serialized, + specifiedType: specifiedType, + serializedList: serializedList, + unhandled: unhandled, + result: result + ); + oneOfDataSrc = unhandled; + final oneOfTypes = [Foo, FooRef, FooRef, Foo, ]; + Object oneOfResult; + Type oneOfType; + switch (discValue) { + case 'Foo': + oneOfResult = serializers.deserialize( + oneOfDataSrc, + specifiedType: FullType(Foo), + ) as Foo; + oneOfType = Foo; + break; + case 'FooRef': + oneOfResult = serializers.deserialize( + oneOfDataSrc, + specifiedType: FullType(FooRef), + ) as FooRef; + oneOfType = FooRef; + break; + case 'REF': + oneOfResult = serializers.deserialize( + oneOfDataSrc, + specifiedType: FullType(FooRef), + ) as FooRef; + oneOfType = FooRef; + break; + case 'VALUE': + oneOfResult = serializers.deserialize( + oneOfDataSrc, + specifiedType: FullType(Foo), + ) as Foo; + oneOfType = Foo; + break; + default: + throw UnsupportedError("Couldn't deserialize oneOf for the discriminator value: ${discValue}"); + } + result.oneOf = OneOfDynamic(typeIndex: oneOfTypes.indexOf(oneOfType), types: oneOfTypes, value: oneOfResult); + return result.build(); + } +} + diff --git a/samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/lib/src/model/ref_or_value_enum.dart b/samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/lib/src/model/ref_or_value_enum.dart new file mode 100644 index 000000000000..27798ad11590 --- /dev/null +++ b/samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/lib/src/model/ref_or_value_enum.dart @@ -0,0 +1,36 @@ +// +// AUTO-GENERATED FILE, DO NOT MODIFY! +// + +// ignore_for_file: unused_element +import 'package:built_collection/built_collection.dart'; +import 'package:built_value/built_value.dart'; +import 'package:built_value/serializer.dart'; + +part 'ref_or_value_enum.g.dart'; + +class RefOrValueEnum extends EnumClass { + + @BuiltValueEnumConst(wireName: r'REF') + static const RefOrValueEnum REF = _$REF; + @BuiltValueEnumConst(wireName: r'VALUE') + static const RefOrValueEnum VALUE = _$VALUE; + @BuiltValueEnumConst(wireName: r'unknown_default_open_api', fallback: true) + static const RefOrValueEnum unknownDefaultOpenApi = _$unknownDefaultOpenApi; + + static Serializer get serializer => _$refOrValueEnumSerializer; + + const RefOrValueEnum._(String name): super(name); + + static BuiltSet get values => _$values; + static RefOrValueEnum valueOf(String name) => _$valueOf(name); +} + +/// Optionally, enum_class can generate a mixin to go with your enum for use +/// with Angular. It exposes your enum constants as getters. So, if you mix it +/// in to your Dart component class, the values become available to the +/// corresponding Angular template. +/// +/// Trigger mixin generation by writing a line like this one next to your enum. +abstract class RefOrValueEnumMixin = Object with _$RefOrValueEnumMixin; + diff --git a/samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/lib/src/serializers.dart b/samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/lib/src/serializers.dart index 55083251e5e8..330c6fd42ea0 100644 --- a/samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/lib/src/serializers.dart +++ b/samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/lib/src/serializers.dart @@ -25,9 +25,11 @@ import 'package:openapi/src/model/extensible.dart'; import 'package:openapi/src/model/foo.dart'; import 'package:openapi/src/model/foo_ref.dart'; import 'package:openapi/src/model/foo_ref_or_value.dart'; +import 'package:openapi/src/model/foo_ref_or_value_enum_mapping.dart'; import 'package:openapi/src/model/pasta.dart'; import 'package:openapi/src/model/pizza.dart'; import 'package:openapi/src/model/pizza_speziale.dart'; +import 'package:openapi/src/model/ref_or_value_enum.dart'; part 'serializers.g.dart'; @@ -43,9 +45,11 @@ part 'serializers.g.dart'; Foo, FooRef, FooRefOrValue, + FooRefOrValueEnumMapping, Pasta, Pizza,$Pizza, PizzaSpeziale, + RefOrValueEnum, ]) Serializers serializers = (_$serializers.toBuilder() ..addBuilderFactory( diff --git a/samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/test/foo_ref_or_value_enum_mapping_test.dart b/samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/test/foo_ref_or_value_enum_mapping_test.dart new file mode 100644 index 000000000000..c370a0ffcb4a --- /dev/null +++ b/samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/test/foo_ref_or_value_enum_mapping_test.dart @@ -0,0 +1,46 @@ +import 'package:test/test.dart'; +import 'package:openapi/openapi.dart'; + +// tests for FooRefOrValueEnumMapping +void main() { + final instance = FooRefOrValueEnumMappingBuilder(); + // TODO add properties to the builder and call build() + + group(FooRefOrValueEnumMapping, () { + // RefOrValueEnum objectType + test('to test the property `objectType`', () async { + // TODO + }); + + // Hyperlink reference + // String href + test('to test the property `href`', () async { + // TODO + }); + + // unique identifier + // String id + test('to test the property `id`', () async { + // TODO + }); + + // A URI to a JSON-Schema file that defines additional attributes and relationships + // String atSchemaLocation + test('to test the property `atSchemaLocation`', () async { + // TODO + }); + + // When sub-classing, this defines the super-class + // String atBaseType + test('to test the property `atBaseType`', () async { + // TODO + }); + + // When sub-classing, this defines the sub-class Extensible name + // String atType + test('to test the property `atType`', () async { + // TODO + }); + + }); +} diff --git a/samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/test/ref_or_value_enum_test.dart b/samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/test/ref_or_value_enum_test.dart new file mode 100644 index 000000000000..71a19dfe0234 --- /dev/null +++ b/samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/test/ref_or_value_enum_test.dart @@ -0,0 +1,9 @@ +import 'package:test/test.dart'; +import 'package:openapi/openapi.dart'; + +// tests for RefOrValueEnum +void main() { + + group(RefOrValueEnum, () { + }); +} diff --git a/samples/openapi3/server/petstore/spring-boot-oneof/.openapi-generator/FILES b/samples/openapi3/server/petstore/spring-boot-oneof/.openapi-generator/FILES index 39b59dbead10..f03a6615287e 100644 --- a/samples/openapi3/server/petstore/spring-boot-oneof/.openapi-generator/FILES +++ b/samples/openapi3/server/petstore/spring-boot-oneof/.openapi-generator/FILES @@ -20,9 +20,11 @@ src/main/java/org/openapitools/model/Extensible.java src/main/java/org/openapitools/model/Foo.java src/main/java/org/openapitools/model/FooRef.java src/main/java/org/openapitools/model/FooRefOrValue.java +src/main/java/org/openapitools/model/FooRefOrValueEnumMapping.java src/main/java/org/openapitools/model/Pasta.java src/main/java/org/openapitools/model/Pizza.java src/main/java/org/openapitools/model/PizzaSpeziale.java +src/main/java/org/openapitools/model/RefOrValueEnum.java src/main/resources/application.properties src/main/resources/openapi.yaml src/test/java/org/openapitools/OpenApiGeneratorApplicationTests.java diff --git a/samples/openapi3/server/petstore/spring-boot-oneof/src/main/java/org/openapitools/model/Foo.java b/samples/openapi3/server/petstore/spring-boot-oneof/src/main/java/org/openapitools/model/Foo.java index b0b6f53b1b16..98cdffff138c 100644 --- a/samples/openapi3/server/petstore/spring-boot-oneof/src/main/java/org/openapitools/model/Foo.java +++ b/samples/openapi3/server/petstore/spring-boot-oneof/src/main/java/org/openapitools/model/Foo.java @@ -24,7 +24,7 @@ @Generated(value = "org.openapitools.codegen.languages.SpringCodegen") -public class Foo extends Entity implements FooRefOrValue { +public class Foo extends Entity implements FooRefOrValue, FooRefOrValueEnumMapping { @JsonProperty("fooPropA") private String fooPropA; @@ -32,6 +32,9 @@ public class Foo extends Entity implements FooRefOrValue { @JsonProperty("fooPropB") private String fooPropB; + @JsonProperty("objectType") + private RefOrValueEnum objectType; + public Foo fooPropA(String fooPropA) { this.fooPropA = fooPropA; return this; @@ -70,6 +73,25 @@ public void setFooPropB(String fooPropB) { this.fooPropB = fooPropB; } + public Foo objectType(RefOrValueEnum objectType) { + this.objectType = objectType; + return this; + } + + /** + * Get objectType + * @return objectType + */ + @NotNull @Valid + @Schema(name = "objectType", required = true) + public RefOrValueEnum getObjectType() { + return objectType; + } + + public void setObjectType(RefOrValueEnum objectType) { + this.objectType = objectType; + } + public Foo href(String href) { super.setHref(href); return this; @@ -106,12 +128,13 @@ public boolean equals(Object o) { Foo foo = (Foo) o; return Objects.equals(this.fooPropA, foo.fooPropA) && Objects.equals(this.fooPropB, foo.fooPropB) && + Objects.equals(this.objectType, foo.objectType) && super.equals(o); } @Override public int hashCode() { - return Objects.hash(fooPropA, fooPropB, super.hashCode()); + return Objects.hash(fooPropA, fooPropB, objectType, super.hashCode()); } @Override @@ -121,6 +144,7 @@ public String toString() { sb.append(" ").append(toIndentedString(super.toString())).append("\n"); sb.append(" fooPropA: ").append(toIndentedString(fooPropA)).append("\n"); sb.append(" fooPropB: ").append(toIndentedString(fooPropB)).append("\n"); + sb.append(" objectType: ").append(toIndentedString(objectType)).append("\n"); sb.append("}"); return sb.toString(); } diff --git a/samples/openapi3/server/petstore/spring-boot-oneof/src/main/java/org/openapitools/model/FooRef.java b/samples/openapi3/server/petstore/spring-boot-oneof/src/main/java/org/openapitools/model/FooRef.java index 5900228902d6..badb0df1b6f4 100644 --- a/samples/openapi3/server/petstore/spring-boot-oneof/src/main/java/org/openapitools/model/FooRef.java +++ b/samples/openapi3/server/petstore/spring-boot-oneof/src/main/java/org/openapitools/model/FooRef.java @@ -24,11 +24,14 @@ @Generated(value = "org.openapitools.codegen.languages.SpringCodegen") -public class FooRef extends EntityRef implements FooRefOrValue { +public class FooRef extends EntityRef implements FooRefOrValue, FooRefOrValueEnumMapping { @JsonProperty("foorefPropA") private String foorefPropA; + @JsonProperty("objectType") + private RefOrValueEnum objectType; + public FooRef foorefPropA(String foorefPropA) { this.foorefPropA = foorefPropA; return this; @@ -48,6 +51,25 @@ public void setFoorefPropA(String foorefPropA) { this.foorefPropA = foorefPropA; } + public FooRef objectType(RefOrValueEnum objectType) { + this.objectType = objectType; + return this; + } + + /** + * Get objectType + * @return objectType + */ + @NotNull @Valid + @Schema(name = "objectType", required = true) + public RefOrValueEnum getObjectType() { + return objectType; + } + + public void setObjectType(RefOrValueEnum objectType) { + this.objectType = objectType; + } + public FooRef name(String name) { super.setName(name); return this; @@ -93,12 +115,13 @@ public boolean equals(Object o) { } FooRef fooRef = (FooRef) o; return Objects.equals(this.foorefPropA, fooRef.foorefPropA) && + Objects.equals(this.objectType, fooRef.objectType) && super.equals(o); } @Override public int hashCode() { - return Objects.hash(foorefPropA, super.hashCode()); + return Objects.hash(foorefPropA, objectType, super.hashCode()); } @Override @@ -107,6 +130,7 @@ public String toString() { sb.append("class FooRef {\n"); sb.append(" ").append(toIndentedString(super.toString())).append("\n"); sb.append(" foorefPropA: ").append(toIndentedString(foorefPropA)).append("\n"); + sb.append(" objectType: ").append(toIndentedString(objectType)).append("\n"); sb.append("}"); return sb.toString(); } diff --git a/samples/openapi3/server/petstore/spring-boot-oneof/src/main/java/org/openapitools/model/FooRefOrValueEnumMapping.java b/samples/openapi3/server/petstore/spring-boot-oneof/src/main/java/org/openapitools/model/FooRefOrValueEnumMapping.java new file mode 100644 index 000000000000..91c907b32374 --- /dev/null +++ b/samples/openapi3/server/petstore/spring-boot-oneof/src/main/java/org/openapitools/model/FooRefOrValueEnumMapping.java @@ -0,0 +1,39 @@ +package org.openapitools.model; + +import java.net.URI; +import java.util.Objects; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonSubTypes; +import com.fasterxml.jackson.annotation.JsonTypeInfo; +import org.openapitools.model.Foo; +import org.openapitools.model.FooRef; +import org.openapitools.model.RefOrValueEnum; +import org.openapitools.jackson.nullable.JsonNullable; +import java.time.OffsetDateTime; +import javax.validation.Valid; +import javax.validation.constraints.*; +import io.swagger.v3.oas.annotations.media.Schema; + + +import java.util.*; +import javax.annotation.Generated; + + +@JsonIgnoreProperties( + value = "objectType", // ignore manually set objectType, it will be automatically generated by Jackson during serialization + allowSetters = true // allows the objectType to be set during deserialization +) +@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "objectType", visible = true) +@JsonSubTypes({ + @JsonSubTypes.Type(value = Foo.class, name = "Foo"), + @JsonSubTypes.Type(value = FooRef.class, name = "FooRef"), + @JsonSubTypes.Type(value = FooRef.class, name = "REF"), + @JsonSubTypes.Type(value = Foo.class, name = "VALUE") +}) + +@Generated(value = "org.openapitools.codegen.languages.SpringCodegen") +public interface FooRefOrValueEnumMapping { + public RefOrValueEnum getObjectType(); +} diff --git a/samples/openapi3/server/petstore/spring-boot-oneof/src/main/java/org/openapitools/model/RefOrValueEnum.java b/samples/openapi3/server/petstore/spring-boot-oneof/src/main/java/org/openapitools/model/RefOrValueEnum.java new file mode 100644 index 000000000000..7e1db8861dd6 --- /dev/null +++ b/samples/openapi3/server/petstore/spring-boot-oneof/src/main/java/org/openapitools/model/RefOrValueEnum.java @@ -0,0 +1,56 @@ +package org.openapitools.model; + +import java.net.URI; +import java.util.Objects; +import com.fasterxml.jackson.annotation.JsonValue; +import org.openapitools.jackson.nullable.JsonNullable; +import java.time.OffsetDateTime; +import javax.validation.Valid; +import javax.validation.constraints.*; +import io.swagger.v3.oas.annotations.media.Schema; + + +import java.util.*; +import javax.annotation.Generated; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; + +/** + * Gets or Sets RefOrValueEnum + */ + +@Generated(value = "org.openapitools.codegen.languages.SpringCodegen") +public enum RefOrValueEnum { + + REF("REF"), + + VALUE("VALUE"); + + private String value; + + RefOrValueEnum(String value) { + this.value = value; + } + + @JsonValue + public String getValue() { + return value; + } + + @Override + public String toString() { + return String.valueOf(value); + } + + @JsonCreator + public static RefOrValueEnum fromValue(String value) { + for (RefOrValueEnum b : RefOrValueEnum.values()) { + if (b.value.equals(value)) { + return b; + } + } + throw new IllegalArgumentException("Unexpected value '" + value + "'"); + } +} + diff --git a/samples/openapi3/server/petstore/spring-boot-oneof/src/main/resources/openapi.yaml b/samples/openapi3/server/petstore/spring-boot-oneof/src/main/resources/openapi.yaml index 9ab9dccf5dfc..3c636c12e23e 100644 --- a/samples/openapi3/server/petstore/spring-boot-oneof/src/main/resources/openapi.yaml +++ b/samples/openapi3/server/petstore/spring-boot-oneof/src/main/resources/openapi.yaml @@ -151,6 +151,27 @@ components: - $ref: '#/components/schemas/FooRef' type: object x-one-of-name: FooRefOrValue + RefOrValueEnum: + enum: + - REF + - VALUE + type: string + FooRefOrValueEnumMapping: + discriminator: + mapping: + VALUE: '#/components/schemas/Foo' + REF: '#/components/schemas/FooRef' + propertyName: objectType + oneOf: + - $ref: '#/components/schemas/Foo' + - $ref: '#/components/schemas/FooRef' + properties: + objectType: + $ref: '#/components/schemas/RefOrValueEnum' + required: + - objectType + type: object + x-one-of-name: FooRefOrValueEnumMapping Foo: allOf: - $ref: '#/components/schemas/Entity' From e07aca2fadcb178ef6444df802d97452c71b0869 Mon Sep 17 00:00:00 2001 From: Bernie Schelberg Date: Fri, 25 Nov 2022 14:03:05 +1000 Subject: [PATCH 05/12] Generate samples --- .../.openapi-generator/FILES | 2 -- .../.openapi-generator/FILES | 1 + .../EnumConverterConfiguration.java | 22 +++++++++++++++++++ .../main/java/org/openapitools/model/Foo.java | 1 + .../java/org/openapitools/model/FooRef.java | 1 + .../model/FooRefOrValueEnumMapping.java | 1 + 6 files changed, 26 insertions(+), 2 deletions(-) create mode 100644 samples/openapi3/server/petstore/spring-boot-oneof/src/main/java/org/openapitools/configuration/EnumConverterConfiguration.java diff --git a/samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/.openapi-generator/FILES b/samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/.openapi-generator/FILES index 8c9d717e6f9a..091dc2d51cfb 100644 --- a/samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/.openapi-generator/FILES +++ b/samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/.openapi-generator/FILES @@ -49,5 +49,3 @@ lib/src/model/pizza_speziale.dart lib/src/model/ref_or_value_enum.dart lib/src/serializers.dart pubspec.yaml -test/foo_ref_or_value_enum_mapping_test.dart -test/ref_or_value_enum_test.dart diff --git a/samples/openapi3/server/petstore/spring-boot-oneof/.openapi-generator/FILES b/samples/openapi3/server/petstore/spring-boot-oneof/.openapi-generator/FILES index f03a6615287e..088a80e23e29 100644 --- a/samples/openapi3/server/petstore/spring-boot-oneof/.openapi-generator/FILES +++ b/samples/openapi3/server/petstore/spring-boot-oneof/.openapi-generator/FILES @@ -7,6 +7,7 @@ src/main/java/org/openapitools/api/BarApi.java src/main/java/org/openapitools/api/BarApiController.java src/main/java/org/openapitools/api/FooApi.java src/main/java/org/openapitools/api/FooApiController.java +src/main/java/org/openapitools/configuration/EnumConverterConfiguration.java src/main/java/org/openapitools/configuration/HomeController.java src/main/java/org/openapitools/configuration/SpringDocConfiguration.java src/main/java/org/openapitools/model/Addressable.java diff --git a/samples/openapi3/server/petstore/spring-boot-oneof/src/main/java/org/openapitools/configuration/EnumConverterConfiguration.java b/samples/openapi3/server/petstore/spring-boot-oneof/src/main/java/org/openapitools/configuration/EnumConverterConfiguration.java new file mode 100644 index 000000000000..a4e99bff26ba --- /dev/null +++ b/samples/openapi3/server/petstore/spring-boot-oneof/src/main/java/org/openapitools/configuration/EnumConverterConfiguration.java @@ -0,0 +1,22 @@ +package org.openapitools.configuration; + +import org.openapitools.model.RefOrValueEnum; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.convert.converter.Converter; + +@Configuration +public class EnumConverterConfiguration { + + @Bean + Converter refOrValueEnumConverter() { + return new Converter() { + @Override + public RefOrValueEnum convert(String source) { + return RefOrValueEnum.fromValue(source); + } + }; + } + +} diff --git a/samples/openapi3/server/petstore/spring-boot-oneof/src/main/java/org/openapitools/model/Foo.java b/samples/openapi3/server/petstore/spring-boot-oneof/src/main/java/org/openapitools/model/Foo.java index 98cdffff138c..ef7a196db5ad 100644 --- a/samples/openapi3/server/petstore/spring-boot-oneof/src/main/java/org/openapitools/model/Foo.java +++ b/samples/openapi3/server/petstore/spring-boot-oneof/src/main/java/org/openapitools/model/Foo.java @@ -8,6 +8,7 @@ import com.fasterxml.jackson.annotation.JsonSubTypes; import com.fasterxml.jackson.annotation.JsonTypeInfo; import org.openapitools.model.Entity; +import com.fasterxml.jackson.annotation.JsonValue; import org.openapitools.jackson.nullable.JsonNullable; import java.time.OffsetDateTime; import javax.validation.Valid; diff --git a/samples/openapi3/server/petstore/spring-boot-oneof/src/main/java/org/openapitools/model/FooRef.java b/samples/openapi3/server/petstore/spring-boot-oneof/src/main/java/org/openapitools/model/FooRef.java index badb0df1b6f4..94712d424ca2 100644 --- a/samples/openapi3/server/petstore/spring-boot-oneof/src/main/java/org/openapitools/model/FooRef.java +++ b/samples/openapi3/server/petstore/spring-boot-oneof/src/main/java/org/openapitools/model/FooRef.java @@ -8,6 +8,7 @@ import com.fasterxml.jackson.annotation.JsonSubTypes; import com.fasterxml.jackson.annotation.JsonTypeInfo; import org.openapitools.model.EntityRef; +import com.fasterxml.jackson.annotation.JsonValue; import org.openapitools.jackson.nullable.JsonNullable; import java.time.OffsetDateTime; import javax.validation.Valid; diff --git a/samples/openapi3/server/petstore/spring-boot-oneof/src/main/java/org/openapitools/model/FooRefOrValueEnumMapping.java b/samples/openapi3/server/petstore/spring-boot-oneof/src/main/java/org/openapitools/model/FooRefOrValueEnumMapping.java index 91c907b32374..bd62a7714e9c 100644 --- a/samples/openapi3/server/petstore/spring-boot-oneof/src/main/java/org/openapitools/model/FooRefOrValueEnumMapping.java +++ b/samples/openapi3/server/petstore/spring-boot-oneof/src/main/java/org/openapitools/model/FooRefOrValueEnumMapping.java @@ -7,6 +7,7 @@ import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonSubTypes; import com.fasterxml.jackson.annotation.JsonTypeInfo; +import com.fasterxml.jackson.annotation.JsonValue; import org.openapitools.model.Foo; import org.openapitools.model.FooRef; import org.openapitools.model.RefOrValueEnum; From 0e08a4aa6339375f5d1cdf42450eafd2344d9630 Mon Sep 17 00:00:00 2001 From: Bernie Schelberg Date: Thu, 23 Feb 2023 08:42:20 +1000 Subject: [PATCH 06/12] Generate samples after merging master --- .../model/foo_ref_or_value_enum_mapping.dart | 45 +++++++++++-------- .../EnumConverterConfiguration.java | 2 +- .../main/java/org/openapitools/model/Foo.java | 2 +- .../java/org/openapitools/model/FooRef.java | 2 +- 4 files changed, 29 insertions(+), 22 deletions(-) diff --git a/samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/lib/src/model/foo_ref_or_value_enum_mapping.dart b/samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/lib/src/model/foo_ref_or_value_enum_mapping.dart index 949ecde2eea5..228860679018 100644 --- a/samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/lib/src/model/foo_ref_or_value_enum_mapping.dart +++ b/samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/lib/src/model/foo_ref_or_value_enum_mapping.dart @@ -33,8 +33,6 @@ abstract class FooRefOrValueEnumMapping implements Built discriminatorMapping = { - r'Foo': Foo, - r'FooRef': FooRef, r'REF': FooRef, r'VALUE': Foo, }; @@ -50,6 +48,29 @@ abstract class FooRefOrValueEnumMapping implements Built get serializer => _$FooRefOrValueEnumMappingSerializer(); } +extension FooRefOrValueEnumMappingDiscriminatorExt on FooRefOrValueEnumMapping { + String? get discriminatorValue { + if (this is FooRef) { + return r'REF'; + } + if (this is Foo) { + return r'VALUE'; + } + return null; + } +} +extension FooRefOrValueEnumMappingBuilderDiscriminatorExt on FooRefOrValueEnumMappingBuilder { + String? get discriminatorValue { + if (this is FooRefBuilder) { + return r'REF'; + } + if (this is FooBuilder) { + return r'VALUE'; + } + return null; + } +} + class _$FooRefOrValueEnumMappingSerializer implements PrimitiveSerializer { @override final Iterable types = const [FooRefOrValueEnumMapping, _$FooRefOrValueEnumMapping]; @@ -129,32 +150,18 @@ class _$FooRefOrValueEnumMappingSerializer implements PrimitiveSerializer refOrValueEnumConverter() { return new Converter() { @Override diff --git a/samples/openapi3/server/petstore/spring-boot-oneof/src/main/java/org/openapitools/model/Foo.java b/samples/openapi3/server/petstore/spring-boot-oneof/src/main/java/org/openapitools/model/Foo.java index 23da6f2a3f6f..2742bf345de7 100644 --- a/samples/openapi3/server/petstore/spring-boot-oneof/src/main/java/org/openapitools/model/Foo.java +++ b/samples/openapi3/server/petstore/spring-boot-oneof/src/main/java/org/openapitools/model/Foo.java @@ -84,7 +84,7 @@ public Foo objectType(RefOrValueEnum objectType) { * @return objectType */ @NotNull @Valid - @Schema(name = "objectType", required = true) + @Schema(name = "objectType", requiredMode = Schema.RequiredMode.REQUIRED) public RefOrValueEnum getObjectType() { return objectType; } diff --git a/samples/openapi3/server/petstore/spring-boot-oneof/src/main/java/org/openapitools/model/FooRef.java b/samples/openapi3/server/petstore/spring-boot-oneof/src/main/java/org/openapitools/model/FooRef.java index cf23df26d45f..8d43512bc577 100644 --- a/samples/openapi3/server/petstore/spring-boot-oneof/src/main/java/org/openapitools/model/FooRef.java +++ b/samples/openapi3/server/petstore/spring-boot-oneof/src/main/java/org/openapitools/model/FooRef.java @@ -62,7 +62,7 @@ public FooRef objectType(RefOrValueEnum objectType) { * @return objectType */ @NotNull @Valid - @Schema(name = "objectType", required = true) + @Schema(name = "objectType", requiredMode = Schema.RequiredMode.REQUIRED) public RefOrValueEnum getObjectType() { return objectType; } From e0f1b1c5be7dc6dec255f64e1158514574b4cca6 Mon Sep 17 00:00:00 2001 From: Bernie Schelberg Date: Mon, 6 Mar 2023 15:52:04 +1000 Subject: [PATCH 07/12] Regenerate samples --- .../Classes/OpenAPIs/APIs.swift | 10 ----- .../Classes/OpenAPIs/Configuration.swift | 4 -- .../OpenAPIs/URLSessionImplementations.swift | 37 ++++--------------- .../main/java/org/openapitools/model/Foo.java | 1 + .../java/org/openapitools/model/FooRef.java | 1 + 5 files changed, 9 insertions(+), 44 deletions(-) diff --git a/samples/client/petstore/swift5/validation/PetstoreClient/Classes/OpenAPIs/APIs.swift b/samples/client/petstore/swift5/validation/PetstoreClient/Classes/OpenAPIs/APIs.swift index 513c1222ada3..30b466c25a1e 100644 --- a/samples/client/petstore/swift5/validation/PetstoreClient/Classes/OpenAPIs/APIs.swift +++ b/samples/client/petstore/swift5/validation/PetstoreClient/Classes/OpenAPIs/APIs.swift @@ -5,14 +5,6 @@ // import Foundation - -// We reverted the change of PetstoreClientAPI to PetstoreClient introduced in https://github.com/OpenAPITools/openapi-generator/pull/9624 -// Because it was causing the following issue https://github.com/OpenAPITools/openapi-generator/issues/9953 -// If you are affected by this issue, please consider removing the following two lines, -// By setting the option removeMigrationProjectNameClass to true in the generator -@available(*, deprecated, renamed: "PetstoreClientAPI") -public typealias PetstoreClient = PetstoreClientAPI - open class PetstoreClientAPI { public static var basePath = "http://localhost" public static var customHeaders: [String: String] = [:] @@ -31,8 +23,6 @@ open class RequestBuilder { public let requiresAuthentication: Bool /// Optional block to obtain a reference to the request's progress instance when available. - /// With the URLSession http client the request's progress only works on iOS 11.0, macOS 10.13, macCatalyst 13.0, tvOS 11.0, watchOS 4.0. - /// If you need to get the request's progress in older OS versions, please use Alamofire http client. public var onProgressReady: ((Progress) -> Void)? required public init(method: String, URLString: String, parameters: [String: Any]?, headers: [String: String] = [:], requiresAuthentication: Bool) { diff --git a/samples/client/petstore/swift5/validation/PetstoreClient/Classes/OpenAPIs/Configuration.swift b/samples/client/petstore/swift5/validation/PetstoreClient/Classes/OpenAPIs/Configuration.swift index 03789f4b4925..df53ee090108 100644 --- a/samples/client/petstore/swift5/validation/PetstoreClient/Classes/OpenAPIs/Configuration.swift +++ b/samples/client/petstore/swift5/validation/PetstoreClient/Classes/OpenAPIs/Configuration.swift @@ -8,10 +8,6 @@ import Foundation open class Configuration { - // This value is used to configure the date formatter that is used to serialize dates into JSON format. - // You must set it prior to encoding any dates, and it will only be read once. - @available(*, unavailable, message: "To set a different date format, use CodableHelper.dateFormatter instead.") - public static var dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZZZZZ" /// Configures the range of HTTP status codes that will result in a successful response /// /// If a HTTP status code is outside of this range the response will be interpreted as failed. diff --git a/samples/client/petstore/swift5/validation/PetstoreClient/Classes/OpenAPIs/URLSessionImplementations.swift b/samples/client/petstore/swift5/validation/PetstoreClient/Classes/OpenAPIs/URLSessionImplementations.swift index 635c69cd6a8a..f04c90878cbb 100644 --- a/samples/client/petstore/swift5/validation/PetstoreClient/Classes/OpenAPIs/URLSessionImplementations.swift +++ b/samples/client/petstore/swift5/validation/PetstoreClient/Classes/OpenAPIs/URLSessionImplementations.swift @@ -52,7 +52,7 @@ open class URLSessionRequestBuilder: RequestBuilder { - intercept and handle errors like authorization - retry the request. */ - @available(*, deprecated, message: "Please override execute() method to intercept and handle errors like authorization or retry the request. Check the Wiki for more info. https://github.com/OpenAPITools/openapi-generator/wiki/FAQ#how-do-i-implement-bearer-token-authentication-with-urlsession-on-the-swift-api-client") + @available(*, unavailable, message: "Please override execute() method to intercept and handle errors like authorization or retry the request. Check the Wiki for more info. https://github.com/OpenAPITools/openapi-generator/wiki/FAQ#how-do-i-implement-bearer-token-authentication-with-urlsession-on-the-swift-api-client") public var taskCompletionShouldRetry: ((Data?, URLResponse?, Error?, @escaping (Bool) -> Void) -> Void)? required public init(method: String, URLString: String, parameters: [String: Any]?, headers: [String: String] = [:], requiresAuthentication: Bool) { @@ -92,10 +92,6 @@ open class URLSessionRequestBuilder: RequestBuilder { originalRequest.httpMethod = method.rawValue - headers.forEach { key, value in - originalRequest.setValue(value, forHTTPHeaderField: key) - } - buildHeaders().forEach { key, value in originalRequest.setValue(value, forHTTPHeaderField: key) } @@ -145,32 +141,13 @@ open class URLSessionRequestBuilder: RequestBuilder { } let dataTask = urlSession.dataTask(with: request) { data, response, error in - - if let taskCompletionShouldRetry = self.taskCompletionShouldRetry { - - taskCompletionShouldRetry(data, response, error) { shouldRetry in - - if shouldRetry { - cleanupRequest() - self.execute(apiResponseQueue, completion) - } else { - apiResponseQueue.async { - self.processRequestResponse(urlRequest: request, data: data, response: response, error: error, completion: completion) - cleanupRequest() - } - } - } - } else { - apiResponseQueue.async { - self.processRequestResponse(urlRequest: request, data: data, response: response, error: error, completion: completion) - cleanupRequest() - } + apiResponseQueue.async { + self.processRequestResponse(urlRequest: request, data: data, response: response, error: error, completion: completion) + cleanupRequest() } } - if #available(iOS 11.0, macOS 10.13, macCatalyst 13.0, tvOS 11.0, watchOS 4.0, *) { - onProgressReady?(dataTask.progress) - } + onProgressReady?(dataTask.progress) taskIdentifier = dataTask.taskIdentifier challengeHandlerStore[dataTask.taskIdentifier] = taskDidReceiveChallenge @@ -218,10 +195,10 @@ open class URLSessionRequestBuilder: RequestBuilder { open func buildHeaders() -> [String: String] { var httpHeaders: [String: String] = [:] - for (key, value) in headers { + for (key, value) in PetstoreClientAPI.customHeaders { httpHeaders[key] = value } - for (key, value) in PetstoreClientAPI.customHeaders { + for (key, value) in headers { httpHeaders[key] = value } return httpHeaders diff --git a/samples/openapi3/server/petstore/spring-boot-oneof/src/main/java/org/openapitools/model/Foo.java b/samples/openapi3/server/petstore/spring-boot-oneof/src/main/java/org/openapitools/model/Foo.java index cbdc7a66749b..d63d7287a78b 100644 --- a/samples/openapi3/server/petstore/spring-boot-oneof/src/main/java/org/openapitools/model/Foo.java +++ b/samples/openapi3/server/petstore/spring-boot-oneof/src/main/java/org/openapitools/model/Foo.java @@ -50,6 +50,7 @@ public Foo() { */ public Foo(String atType) { super(atType); + this.objectType = objectType; } public Foo fooPropA(String fooPropA) { diff --git a/samples/openapi3/server/petstore/spring-boot-oneof/src/main/java/org/openapitools/model/FooRef.java b/samples/openapi3/server/petstore/spring-boot-oneof/src/main/java/org/openapitools/model/FooRef.java index 0ea787d6739c..c5f7f93e66a3 100644 --- a/samples/openapi3/server/petstore/spring-boot-oneof/src/main/java/org/openapitools/model/FooRef.java +++ b/samples/openapi3/server/petstore/spring-boot-oneof/src/main/java/org/openapitools/model/FooRef.java @@ -47,6 +47,7 @@ public FooRef() { */ public FooRef(String atType) { super(atType); + this.objectType = objectType; } public FooRef foorefPropA(String foorefPropA) { From 78571210d93bca956fee3696ab59a98eaa39dfba Mon Sep 17 00:00:00 2001 From: Bernie Schelberg Date: Mon, 6 Mar 2023 15:59:53 +1000 Subject: [PATCH 08/12] Fix raw use of parameterized class --- .../src/main/java/org/openapitools/codegen/DefaultCodegen.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java index 4487b171d03e..d766538eeaf0 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java @@ -3461,7 +3461,7 @@ protected CodegenDiscriminator createDiscriminator(String schemaName, Schema sch // the future.. String propertyType = Optional.ofNullable(schema.getProperties()) - .map(p -> (Schema) p.get(discriminatorPropertyName)) + .map(p -> (Schema) p.get(discriminatorPropertyName)) .map(Schema::get$ref) .map(ModelUtils::getSimpleRef) .orElseGet(() -> typeMapping.get("string")); From 77cc895970f251b66a199457c7581d5582243d21 Mon Sep 17 00:00:00 2001 From: Bernie Schelberg Date: Tue, 7 Mar 2023 16:34:15 +1000 Subject: [PATCH 09/12] Add test showing serialization and deserialization of classes with enum discriminator --- .../oneof_polymorphism_and_inheritance.yaml | 50 +++-- .../.openapi-generator/FILES | 12 +- .../README.md | 6 +- .../doc/Apple.md | 15 ++ .../doc/Banana.md | 15 ++ .../doc/Fruit.md | 17 ++ .../doc/FruitType.md | 14 ++ .../lib/openapi.dart | 6 +- .../lib/src/model/apple.dart | 106 +++++++++++ .../lib/src/model/banana.dart | 106 +++++++++++ .../lib/src/model/fruit.dart | 175 ++++++++++++++++++ .../lib/src/model/fruit_type.dart | 36 ++++ .../lib/src/serializers.dart | 12 +- .../test/apple_test.dart | 16 ++ .../test/banana_test.dart | 16 ++ .../test/fruit_test.dart | 26 +++ .../test/fruit_type_test.dart | 9 + .../.openapi-generator/FILES | 6 +- .../EnumConverterConfiguration.java | 12 +- .../java/org/openapitools/model/Apple.java | 128 +++++++++++++ .../java/org/openapitools/model/Banana.java | 128 +++++++++++++ .../main/java/org/openapitools/model/Foo.java | 30 +-- .../java/org/openapitools/model/FooRef.java | 30 +-- ...oRefOrValueEnumMapping.java => Fruit.java} | 24 +-- .../{RefOrValueEnum.java => FruitType.java} | 14 +- .../src/main/resources/openapi.yaml | 56 +++--- .../openapitools/model/FruitJacksonTest.java | 51 +++++ 27 files changed, 982 insertions(+), 134 deletions(-) create mode 100644 samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/doc/Apple.md create mode 100644 samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/doc/Banana.md create mode 100644 samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/doc/Fruit.md create mode 100644 samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/doc/FruitType.md create mode 100644 samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/lib/src/model/apple.dart create mode 100644 samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/lib/src/model/banana.dart create mode 100644 samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/lib/src/model/fruit.dart create mode 100644 samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/lib/src/model/fruit_type.dart create mode 100644 samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/test/apple_test.dart create mode 100644 samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/test/banana_test.dart create mode 100644 samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/test/fruit_test.dart create mode 100644 samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/test/fruit_type_test.dart create mode 100644 samples/openapi3/server/petstore/spring-boot-oneof/src/main/java/org/openapitools/model/Apple.java create mode 100644 samples/openapi3/server/petstore/spring-boot-oneof/src/main/java/org/openapitools/model/Banana.java rename samples/openapi3/server/petstore/spring-boot-oneof/src/main/java/org/openapitools/model/{FooRefOrValueEnumMapping.java => Fruit.java} (55%) rename samples/openapi3/server/petstore/spring-boot-oneof/src/main/java/org/openapitools/model/{RefOrValueEnum.java => FruitType.java} (80%) create mode 100644 samples/openapi3/server/petstore/spring-boot-oneof/src/test/java/org/openapitools/model/FruitJacksonTest.java diff --git a/modules/openapi-generator/src/test/resources/3_0/oneof_polymorphism_and_inheritance.yaml b/modules/openapi-generator/src/test/resources/3_0/oneof_polymorphism_and_inheritance.yaml index dc1b50578b72..d890e5fbfd5a 100644 --- a/modules/openapi-generator/src/test/resources/3_0/oneof_polymorphism_and_inheritance.yaml +++ b/modules/openapi-generator/src/test/resources/3_0/oneof_polymorphism_and_inheritance.yaml @@ -105,24 +105,6 @@ components: - $ref: "#/components/schemas/FooRef" discriminator: propertyName: "@type" - RefOrValueEnum: - type: string - enum: [REF, VALUE] - FooRefOrValueEnumMapping: - type: object - properties: - objectType: - $ref: "#/components/schemas/RefOrValueEnum" - required: - - objectType - oneOf: - - $ref: "#/components/schemas/Foo" - - $ref: "#/components/schemas/FooRef" - discriminator: - propertyName: "objectType" - mapping: - VALUE: "#/components/schemas/Foo" - REF: "#/components/schemas/FooRef" Foo: type: object properties: @@ -195,6 +177,38 @@ components: type: string allOf: - $ref: '#/components/schemas/Pizza' + FruitType: + type: string + enum: [APPLE, BANANA] + Fruit: + type: object + properties: + fruitType: + $ref: "#/components/schemas/FruitType" + required: + - fruitType + oneOf: + - $ref: '#/components/schemas/Apple' + - $ref: '#/components/schemas/Banana' + discriminator: + propertyName: fruitType + mapping: + APPLE: '#/components/schemas/Apple' + BANANA: '#/components/schemas/Banana' + Apple: + type: object + required: + - seeds + properties: + seeds: + type: integer + Banana: + type: object + required: + - length + properties: + length: + type: integer requestBodies: Foo: diff --git a/samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/.openapi-generator/FILES b/samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/.openapi-generator/FILES index 091dc2d51cfb..5e9dbd5a0777 100644 --- a/samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/.openapi-generator/FILES +++ b/samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/.openapi-generator/FILES @@ -2,6 +2,8 @@ README.md analysis_options.yaml doc/Addressable.md +doc/Apple.md +doc/Banana.md doc/Bar.md doc/BarApi.md doc/BarCreate.md @@ -14,11 +16,11 @@ doc/Foo.md doc/FooApi.md doc/FooRef.md doc/FooRefOrValue.md -doc/FooRefOrValueEnumMapping.md +doc/Fruit.md +doc/FruitType.md doc/Pasta.md doc/Pizza.md doc/PizzaSpeziale.md -doc/RefOrValueEnum.md lib/openapi.dart lib/src/api.dart lib/src/api/bar_api.dart @@ -31,6 +33,8 @@ lib/src/auth/bearer_auth.dart lib/src/auth/oauth.dart lib/src/date_serializer.dart lib/src/model/addressable.dart +lib/src/model/apple.dart +lib/src/model/banana.dart lib/src/model/bar.dart lib/src/model/bar_create.dart lib/src/model/bar_ref.dart @@ -42,10 +46,10 @@ lib/src/model/extensible.dart lib/src/model/foo.dart lib/src/model/foo_ref.dart lib/src/model/foo_ref_or_value.dart -lib/src/model/foo_ref_or_value_enum_mapping.dart +lib/src/model/fruit.dart +lib/src/model/fruit_type.dart lib/src/model/pasta.dart lib/src/model/pizza.dart lib/src/model/pizza_speziale.dart -lib/src/model/ref_or_value_enum.dart lib/src/serializers.dart pubspec.yaml diff --git a/samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/README.md b/samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/README.md index f97a0be2c8c2..256d7e0c615a 100644 --- a/samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/README.md +++ b/samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/README.md @@ -73,6 +73,8 @@ Class | Method | HTTP request | Description ## Documentation For Models - [Addressable](doc/Addressable.md) + - [Apple](doc/Apple.md) + - [Banana](doc/Banana.md) - [Bar](doc/Bar.md) - [BarCreate](doc/BarCreate.md) - [BarRef](doc/BarRef.md) @@ -83,11 +85,11 @@ Class | Method | HTTP request | Description - [Foo](doc/Foo.md) - [FooRef](doc/FooRef.md) - [FooRefOrValue](doc/FooRefOrValue.md) - - [FooRefOrValueEnumMapping](doc/FooRefOrValueEnumMapping.md) + - [Fruit](doc/Fruit.md) + - [FruitType](doc/FruitType.md) - [Pasta](doc/Pasta.md) - [Pizza](doc/Pizza.md) - [PizzaSpeziale](doc/PizzaSpeziale.md) - - [RefOrValueEnum](doc/RefOrValueEnum.md) ## Documentation For Authorization diff --git a/samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/doc/Apple.md b/samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/doc/Apple.md new file mode 100644 index 000000000000..13b34241ef81 --- /dev/null +++ b/samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/doc/Apple.md @@ -0,0 +1,15 @@ +# openapi.model.Apple + +## Load the model package +```dart +import 'package:openapi/api.dart'; +``` + +## Properties +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**seeds** | **int** | | + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/doc/Banana.md b/samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/doc/Banana.md new file mode 100644 index 000000000000..4c5737d0c2e2 --- /dev/null +++ b/samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/doc/Banana.md @@ -0,0 +1,15 @@ +# openapi.model.Banana + +## Load the model package +```dart +import 'package:openapi/api.dart'; +``` + +## Properties +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**length** | **int** | | + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/doc/Fruit.md b/samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/doc/Fruit.md new file mode 100644 index 000000000000..91c1f1cf9b55 --- /dev/null +++ b/samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/doc/Fruit.md @@ -0,0 +1,17 @@ +# openapi.model.Fruit + +## Load the model package +```dart +import 'package:openapi/api.dart'; +``` + +## Properties +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**fruitType** | [**FruitType**](FruitType.md) | | +**seeds** | **int** | | +**length** | **int** | | + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/doc/FruitType.md b/samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/doc/FruitType.md new file mode 100644 index 000000000000..ce2329c986ad --- /dev/null +++ b/samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/doc/FruitType.md @@ -0,0 +1,14 @@ +# openapi.model.FruitType + +## Load the model package +```dart +import 'package:openapi/api.dart'; +``` + +## Properties +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/lib/openapi.dart b/samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/lib/openapi.dart index 6a0c9e7f258d..a124752d7bf6 100644 --- a/samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/lib/openapi.dart +++ b/samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/lib/openapi.dart @@ -13,6 +13,8 @@ export 'package:openapi/src/api/bar_api.dart'; export 'package:openapi/src/api/foo_api.dart'; export 'package:openapi/src/model/addressable.dart'; +export 'package:openapi/src/model/apple.dart'; +export 'package:openapi/src/model/banana.dart'; export 'package:openapi/src/model/bar.dart'; export 'package:openapi/src/model/bar_create.dart'; export 'package:openapi/src/model/bar_ref.dart'; @@ -23,8 +25,8 @@ export 'package:openapi/src/model/extensible.dart'; export 'package:openapi/src/model/foo.dart'; export 'package:openapi/src/model/foo_ref.dart'; export 'package:openapi/src/model/foo_ref_or_value.dart'; -export 'package:openapi/src/model/foo_ref_or_value_enum_mapping.dart'; +export 'package:openapi/src/model/fruit.dart'; +export 'package:openapi/src/model/fruit_type.dart'; export 'package:openapi/src/model/pasta.dart'; export 'package:openapi/src/model/pizza.dart'; export 'package:openapi/src/model/pizza_speziale.dart'; -export 'package:openapi/src/model/ref_or_value_enum.dart'; diff --git a/samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/lib/src/model/apple.dart b/samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/lib/src/model/apple.dart new file mode 100644 index 000000000000..af659198cbaa --- /dev/null +++ b/samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/lib/src/model/apple.dart @@ -0,0 +1,106 @@ +// +// AUTO-GENERATED FILE, DO NOT MODIFY! +// + +// ignore_for_file: unused_element +import 'package:built_value/built_value.dart'; +import 'package:built_value/serializer.dart'; + +part 'apple.g.dart'; + +/// Apple +/// +/// Properties: +/// * [seeds] +@BuiltValue() +abstract class Apple implements Built { + @BuiltValueField(wireName: r'seeds') + int get seeds; + + Apple._(); + + factory Apple([void updates(AppleBuilder b)]) = _$Apple; + + @BuiltValueHook(initializeBuilder: true) + static void _defaults(AppleBuilder b) => b; + + @BuiltValueSerializer(custom: true) + static Serializer get serializer => _$AppleSerializer(); +} + +class _$AppleSerializer implements PrimitiveSerializer { + @override + final Iterable types = const [Apple, _$Apple]; + + @override + final String wireName = r'Apple'; + + Iterable _serializeProperties( + Serializers serializers, + Apple object, { + FullType specifiedType = FullType.unspecified, + }) sync* { + yield r'seeds'; + yield serializers.serialize( + object.seeds, + specifiedType: const FullType(int), + ); + } + + @override + Object serialize( + Serializers serializers, + Apple object, { + FullType specifiedType = FullType.unspecified, + }) { + return _serializeProperties(serializers, object, specifiedType: specifiedType).toList(); + } + + void _deserializeProperties( + Serializers serializers, + Object serialized, { + FullType specifiedType = FullType.unspecified, + required List serializedList, + required AppleBuilder result, + required List unhandled, + }) { + for (var i = 0; i < serializedList.length; i += 2) { + final key = serializedList[i] as String; + final value = serializedList[i + 1]; + switch (key) { + case r'seeds': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType(int), + ) as int; + result.seeds = valueDes; + break; + default: + unhandled.add(key); + unhandled.add(value); + break; + } + } + } + + @override + Apple deserialize( + Serializers serializers, + Object serialized, { + FullType specifiedType = FullType.unspecified, + }) { + final result = AppleBuilder(); + final serializedList = (serialized as Iterable).toList(); + final unhandled = []; + _deserializeProperties( + serializers, + serialized, + specifiedType: specifiedType, + serializedList: serializedList, + unhandled: unhandled, + result: result, + ); + return result.build(); + } +} + diff --git a/samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/lib/src/model/banana.dart b/samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/lib/src/model/banana.dart new file mode 100644 index 000000000000..d8f534ca171a --- /dev/null +++ b/samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/lib/src/model/banana.dart @@ -0,0 +1,106 @@ +// +// AUTO-GENERATED FILE, DO NOT MODIFY! +// + +// ignore_for_file: unused_element +import 'package:built_value/built_value.dart'; +import 'package:built_value/serializer.dart'; + +part 'banana.g.dart'; + +/// Banana +/// +/// Properties: +/// * [length] +@BuiltValue() +abstract class Banana implements Built { + @BuiltValueField(wireName: r'length') + int get length; + + Banana._(); + + factory Banana([void updates(BananaBuilder b)]) = _$Banana; + + @BuiltValueHook(initializeBuilder: true) + static void _defaults(BananaBuilder b) => b; + + @BuiltValueSerializer(custom: true) + static Serializer get serializer => _$BananaSerializer(); +} + +class _$BananaSerializer implements PrimitiveSerializer { + @override + final Iterable types = const [Banana, _$Banana]; + + @override + final String wireName = r'Banana'; + + Iterable _serializeProperties( + Serializers serializers, + Banana object, { + FullType specifiedType = FullType.unspecified, + }) sync* { + yield r'length'; + yield serializers.serialize( + object.length, + specifiedType: const FullType(int), + ); + } + + @override + Object serialize( + Serializers serializers, + Banana object, { + FullType specifiedType = FullType.unspecified, + }) { + return _serializeProperties(serializers, object, specifiedType: specifiedType).toList(); + } + + void _deserializeProperties( + Serializers serializers, + Object serialized, { + FullType specifiedType = FullType.unspecified, + required List serializedList, + required BananaBuilder result, + required List unhandled, + }) { + for (var i = 0; i < serializedList.length; i += 2) { + final key = serializedList[i] as String; + final value = serializedList[i + 1]; + switch (key) { + case r'length': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType(int), + ) as int; + result.length = valueDes; + break; + default: + unhandled.add(key); + unhandled.add(value); + break; + } + } + } + + @override + Banana deserialize( + Serializers serializers, + Object serialized, { + FullType specifiedType = FullType.unspecified, + }) { + final result = BananaBuilder(); + final serializedList = (serialized as Iterable).toList(); + final unhandled = []; + _deserializeProperties( + serializers, + serialized, + specifiedType: specifiedType, + serializedList: serializedList, + unhandled: unhandled, + result: result, + ); + return result.build(); + } +} + diff --git a/samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/lib/src/model/fruit.dart b/samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/lib/src/model/fruit.dart new file mode 100644 index 000000000000..f4e0e74496ce --- /dev/null +++ b/samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/lib/src/model/fruit.dart @@ -0,0 +1,175 @@ +// +// AUTO-GENERATED FILE, DO NOT MODIFY! +// + +// ignore_for_file: unused_element +import 'package:openapi/src/model/apple.dart'; +import 'package:openapi/src/model/banana.dart'; +import 'package:openapi/src/model/fruit_type.dart'; +import 'package:built_value/built_value.dart'; +import 'package:built_value/serializer.dart'; +import 'package:one_of/one_of.dart'; + +part 'fruit.g.dart'; + +/// Fruit +/// +/// Properties: +/// * [fruitType] +/// * [seeds] +/// * [length] +@BuiltValue() +abstract class Fruit implements Built { + @BuiltValueField(wireName: r'fruitType') + FruitType get fruitType; + // enum fruitTypeEnum { APPLE, BANANA, }; + + /// One Of [Apple], [Banana] + OneOf get oneOf; + + static const String discriminatorFieldName = r'fruitType'; + + static const Map discriminatorMapping = { + r'APPLE': Apple, + r'BANANA': Banana, + }; + + Fruit._(); + + factory Fruit([void updates(FruitBuilder b)]) = _$Fruit; + + @BuiltValueHook(initializeBuilder: true) + static void _defaults(FruitBuilder b) => b; + + @BuiltValueSerializer(custom: true) + static Serializer get serializer => _$FruitSerializer(); +} + +extension FruitDiscriminatorExt on Fruit { + String? get discriminatorValue { + if (this is Apple) { + return r'APPLE'; + } + if (this is Banana) { + return r'BANANA'; + } + return null; + } +} +extension FruitBuilderDiscriminatorExt on FruitBuilder { + String? get discriminatorValue { + if (this is AppleBuilder) { + return r'APPLE'; + } + if (this is BananaBuilder) { + return r'BANANA'; + } + return null; + } +} + +class _$FruitSerializer implements PrimitiveSerializer { + @override + final Iterable types = const [Fruit, _$Fruit]; + + @override + final String wireName = r'Fruit'; + + Iterable _serializeProperties( + Serializers serializers, + Fruit object, { + FullType specifiedType = FullType.unspecified, + }) sync* { + yield r'fruitType'; + yield serializers.serialize( + object.fruitType, + specifiedType: const FullType(FruitType), + ); + } + + @override + Object serialize( + Serializers serializers, + Fruit object, { + FullType specifiedType = FullType.unspecified, + }) { + final oneOf = object.oneOf; + final result = _serializeProperties(serializers, object, specifiedType: specifiedType).toList(); + result.addAll(serializers.serialize(oneOf.value, specifiedType: FullType(oneOf.valueType)) as Iterable); + return result; + } + + void _deserializeProperties( + Serializers serializers, + Object serialized, { + FullType specifiedType = FullType.unspecified, + required List serializedList, + required FruitBuilder result, + required List unhandled, + }) { + for (var i = 0; i < serializedList.length; i += 2) { + final key = serializedList[i] as String; + final value = serializedList[i + 1]; + switch (key) { + case r'fruitType': + final valueDes = serializers.deserialize( + value, + specifiedType: const FullType(FruitType), + ) as FruitType; + result.fruitType = valueDes; + break; + default: + unhandled.add(key); + unhandled.add(value); + break; + } + } + } + + @override + Fruit deserialize( + Serializers serializers, + Object serialized, { + FullType specifiedType = FullType.unspecified, + }) { + final result = FruitBuilder(); + Object? oneOfDataSrc; + final serializedList = (serialized as Iterable).toList(); + final discIndex = serializedList.indexOf(Fruit.discriminatorFieldName) + 1; + final discValue = serializers.deserialize(serializedList[discIndex], specifiedType: FullType(String)) as String; + final unhandled = []; + _deserializeProperties( + serializers, + serialized, + specifiedType: specifiedType, + serializedList: serializedList, + unhandled: unhandled, + result: result + ); + oneOfDataSrc = unhandled; + final oneOfTypes = [Apple, Banana, ]; + Object oneOfResult; + Type oneOfType; + switch (discValue) { + case r'APPLE': + oneOfResult = serializers.deserialize( + oneOfDataSrc, + specifiedType: FullType(Apple), + ) as Apple; + oneOfType = Apple; + break; + case r'BANANA': + oneOfResult = serializers.deserialize( + oneOfDataSrc, + specifiedType: FullType(Banana), + ) as Banana; + oneOfType = Banana; + break; + default: + throw UnsupportedError("Couldn't deserialize oneOf for the discriminator value: ${discValue}"); + } + result.oneOf = OneOfDynamic(typeIndex: oneOfTypes.indexOf(oneOfType), types: oneOfTypes, value: oneOfResult); + return result.build(); + } +} + diff --git a/samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/lib/src/model/fruit_type.dart b/samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/lib/src/model/fruit_type.dart new file mode 100644 index 000000000000..3985f198fd0a --- /dev/null +++ b/samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/lib/src/model/fruit_type.dart @@ -0,0 +1,36 @@ +// +// AUTO-GENERATED FILE, DO NOT MODIFY! +// + +// ignore_for_file: unused_element +import 'package:built_collection/built_collection.dart'; +import 'package:built_value/built_value.dart'; +import 'package:built_value/serializer.dart'; + +part 'fruit_type.g.dart'; + +class FruitType extends EnumClass { + + @BuiltValueEnumConst(wireName: r'APPLE') + static const FruitType APPLE = _$APPLE; + @BuiltValueEnumConst(wireName: r'BANANA') + static const FruitType BANANA = _$BANANA; + @BuiltValueEnumConst(wireName: r'unknown_default_open_api', fallback: true) + static const FruitType unknownDefaultOpenApi = _$unknownDefaultOpenApi; + + static Serializer get serializer => _$fruitTypeSerializer; + + const FruitType._(String name): super(name); + + static BuiltSet get values => _$values; + static FruitType valueOf(String name) => _$valueOf(name); +} + +/// Optionally, enum_class can generate a mixin to go with your enum for use +/// with Angular. It exposes your enum constants as getters. So, if you mix it +/// in to your Dart component class, the values become available to the +/// corresponding Angular template. +/// +/// Trigger mixin generation by writing a line like this one next to your enum. +abstract class FruitTypeMixin = Object with _$FruitTypeMixin; + diff --git a/samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/lib/src/serializers.dart b/samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/lib/src/serializers.dart index 330c6fd42ea0..14964c349ade 100644 --- a/samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/lib/src/serializers.dart +++ b/samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/lib/src/serializers.dart @@ -15,6 +15,8 @@ import 'package:openapi/src/date_serializer.dart'; import 'package:openapi/src/model/date.dart'; import 'package:openapi/src/model/addressable.dart'; +import 'package:openapi/src/model/apple.dart'; +import 'package:openapi/src/model/banana.dart'; import 'package:openapi/src/model/bar.dart'; import 'package:openapi/src/model/bar_create.dart'; import 'package:openapi/src/model/bar_ref.dart'; @@ -25,16 +27,18 @@ import 'package:openapi/src/model/extensible.dart'; import 'package:openapi/src/model/foo.dart'; import 'package:openapi/src/model/foo_ref.dart'; import 'package:openapi/src/model/foo_ref_or_value.dart'; -import 'package:openapi/src/model/foo_ref_or_value_enum_mapping.dart'; +import 'package:openapi/src/model/fruit.dart'; +import 'package:openapi/src/model/fruit_type.dart'; import 'package:openapi/src/model/pasta.dart'; import 'package:openapi/src/model/pizza.dart'; import 'package:openapi/src/model/pizza_speziale.dart'; -import 'package:openapi/src/model/ref_or_value_enum.dart'; part 'serializers.g.dart'; @SerializersFor([ Addressable,$Addressable, + Apple, + Banana, Bar, BarCreate, BarRef, @@ -45,11 +49,11 @@ part 'serializers.g.dart'; Foo, FooRef, FooRefOrValue, - FooRefOrValueEnumMapping, + Fruit, + FruitType, Pasta, Pizza,$Pizza, PizzaSpeziale, - RefOrValueEnum, ]) Serializers serializers = (_$serializers.toBuilder() ..addBuilderFactory( diff --git a/samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/test/apple_test.dart b/samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/test/apple_test.dart new file mode 100644 index 000000000000..4e133c847065 --- /dev/null +++ b/samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/test/apple_test.dart @@ -0,0 +1,16 @@ +import 'package:test/test.dart'; +import 'package:openapi/openapi.dart'; + +// tests for Apple +void main() { + final instance = AppleBuilder(); + // TODO add properties to the builder and call build() + + group(Apple, () { + // int seeds + test('to test the property `seeds`', () async { + // TODO + }); + + }); +} diff --git a/samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/test/banana_test.dart b/samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/test/banana_test.dart new file mode 100644 index 000000000000..ca325e17daef --- /dev/null +++ b/samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/test/banana_test.dart @@ -0,0 +1,16 @@ +import 'package:test/test.dart'; +import 'package:openapi/openapi.dart'; + +// tests for Banana +void main() { + final instance = BananaBuilder(); + // TODO add properties to the builder and call build() + + group(Banana, () { + // int length + test('to test the property `length`', () async { + // TODO + }); + + }); +} diff --git a/samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/test/fruit_test.dart b/samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/test/fruit_test.dart new file mode 100644 index 000000000000..fde88bed9a8e --- /dev/null +++ b/samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/test/fruit_test.dart @@ -0,0 +1,26 @@ +import 'package:test/test.dart'; +import 'package:openapi/openapi.dart'; + +// tests for Fruit +void main() { + final instance = FruitBuilder(); + // TODO add properties to the builder and call build() + + group(Fruit, () { + // FruitType fruitType + test('to test the property `fruitType`', () async { + // TODO + }); + + // int seeds + test('to test the property `seeds`', () async { + // TODO + }); + + // int length + test('to test the property `length`', () async { + // TODO + }); + + }); +} diff --git a/samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/test/fruit_type_test.dart b/samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/test/fruit_type_test.dart new file mode 100644 index 000000000000..9bf9b6c2dd45 --- /dev/null +++ b/samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/test/fruit_type_test.dart @@ -0,0 +1,9 @@ +import 'package:test/test.dart'; +import 'package:openapi/openapi.dart'; + +// tests for FruitType +void main() { + + group(FruitType, () { + }); +} diff --git a/samples/openapi3/server/petstore/spring-boot-oneof/.openapi-generator/FILES b/samples/openapi3/server/petstore/spring-boot-oneof/.openapi-generator/FILES index 088a80e23e29..a44588157f3b 100644 --- a/samples/openapi3/server/petstore/spring-boot-oneof/.openapi-generator/FILES +++ b/samples/openapi3/server/petstore/spring-boot-oneof/.openapi-generator/FILES @@ -11,6 +11,8 @@ src/main/java/org/openapitools/configuration/EnumConverterConfiguration.java src/main/java/org/openapitools/configuration/HomeController.java src/main/java/org/openapitools/configuration/SpringDocConfiguration.java src/main/java/org/openapitools/model/Addressable.java +src/main/java/org/openapitools/model/Apple.java +src/main/java/org/openapitools/model/Banana.java src/main/java/org/openapitools/model/Bar.java src/main/java/org/openapitools/model/BarCreate.java src/main/java/org/openapitools/model/BarRef.java @@ -21,11 +23,11 @@ src/main/java/org/openapitools/model/Extensible.java src/main/java/org/openapitools/model/Foo.java src/main/java/org/openapitools/model/FooRef.java src/main/java/org/openapitools/model/FooRefOrValue.java -src/main/java/org/openapitools/model/FooRefOrValueEnumMapping.java +src/main/java/org/openapitools/model/Fruit.java +src/main/java/org/openapitools/model/FruitType.java src/main/java/org/openapitools/model/Pasta.java src/main/java/org/openapitools/model/Pizza.java src/main/java/org/openapitools/model/PizzaSpeziale.java -src/main/java/org/openapitools/model/RefOrValueEnum.java src/main/resources/application.properties src/main/resources/openapi.yaml src/test/java/org/openapitools/OpenApiGeneratorApplicationTests.java diff --git a/samples/openapi3/server/petstore/spring-boot-oneof/src/main/java/org/openapitools/configuration/EnumConverterConfiguration.java b/samples/openapi3/server/petstore/spring-boot-oneof/src/main/java/org/openapitools/configuration/EnumConverterConfiguration.java index cb7fe8d1c9a4..dc5bf376b0f3 100644 --- a/samples/openapi3/server/petstore/spring-boot-oneof/src/main/java/org/openapitools/configuration/EnumConverterConfiguration.java +++ b/samples/openapi3/server/petstore/spring-boot-oneof/src/main/java/org/openapitools/configuration/EnumConverterConfiguration.java @@ -1,6 +1,6 @@ package org.openapitools.configuration; -import org.openapitools.model.RefOrValueEnum; +import org.openapitools.model.FruitType; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -9,12 +9,12 @@ @Configuration public class EnumConverterConfiguration { - @Bean(name = "org.openapitools.configuration.EnumConverterConfiguration.refOrValueEnumConverter") - Converter refOrValueEnumConverter() { - return new Converter() { + @Bean(name = "org.openapitools.configuration.EnumConverterConfiguration.fruitTypeConverter") + Converter fruitTypeConverter() { + return new Converter() { @Override - public RefOrValueEnum convert(String source) { - return RefOrValueEnum.fromValue(source); + public FruitType convert(String source) { + return FruitType.fromValue(source); } }; } diff --git a/samples/openapi3/server/petstore/spring-boot-oneof/src/main/java/org/openapitools/model/Apple.java b/samples/openapi3/server/petstore/spring-boot-oneof/src/main/java/org/openapitools/model/Apple.java new file mode 100644 index 000000000000..3aa2e0c8b4c7 --- /dev/null +++ b/samples/openapi3/server/petstore/spring-boot-oneof/src/main/java/org/openapitools/model/Apple.java @@ -0,0 +1,128 @@ +package org.openapitools.model; + +import java.net.URI; +import java.util.Objects; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonSubTypes; +import com.fasterxml.jackson.annotation.JsonTypeInfo; +import com.fasterxml.jackson.annotation.JsonValue; +import org.openapitools.jackson.nullable.JsonNullable; +import java.time.OffsetDateTime; +import javax.validation.Valid; +import javax.validation.constraints.*; +import io.swagger.v3.oas.annotations.media.Schema; + + +import java.util.*; +import javax.annotation.Generated; + +/** + * Apple + */ + +@Generated(value = "org.openapitools.codegen.languages.SpringCodegen") +public class Apple implements Fruit { + + @JsonProperty("seeds") + private Integer seeds; + + @JsonProperty("fruitType") + private FruitType fruitType; + + /** + * Default constructor + * @deprecated Use {@link Apple#Apple(Integer)} + */ + @Deprecated + public Apple() { + super(); + } + + /** + * Constructor with only required parameters + */ + public Apple(Integer seeds) { + this.seeds = seeds; + this.fruitType = fruitType; + } + + public Apple seeds(Integer seeds) { + this.seeds = seeds; + return this; + } + + /** + * Get seeds + * @return seeds + */ + @NotNull + @Schema(name = "seeds", requiredMode = Schema.RequiredMode.REQUIRED) + public Integer getSeeds() { + return seeds; + } + + public void setSeeds(Integer seeds) { + this.seeds = seeds; + } + + public Apple fruitType(FruitType fruitType) { + this.fruitType = fruitType; + return this; + } + + /** + * Get fruitType + * @return fruitType + */ + @NotNull @Valid + @Schema(name = "fruitType", requiredMode = Schema.RequiredMode.REQUIRED) + public FruitType getFruitType() { + return fruitType; + } + + public void setFruitType(FruitType fruitType) { + this.fruitType = fruitType; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + Apple apple = (Apple) o; + return Objects.equals(this.seeds, apple.seeds) && + Objects.equals(this.fruitType, apple.fruitType); + } + + @Override + public int hashCode() { + return Objects.hash(seeds, fruitType); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class Apple {\n"); + sb.append(" seeds: ").append(toIndentedString(seeds)).append("\n"); + sb.append(" fruitType: ").append(toIndentedString(fruitType)).append("\n"); + sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } +} + diff --git a/samples/openapi3/server/petstore/spring-boot-oneof/src/main/java/org/openapitools/model/Banana.java b/samples/openapi3/server/petstore/spring-boot-oneof/src/main/java/org/openapitools/model/Banana.java new file mode 100644 index 000000000000..92ae7b556b9c --- /dev/null +++ b/samples/openapi3/server/petstore/spring-boot-oneof/src/main/java/org/openapitools/model/Banana.java @@ -0,0 +1,128 @@ +package org.openapitools.model; + +import java.net.URI; +import java.util.Objects; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonSubTypes; +import com.fasterxml.jackson.annotation.JsonTypeInfo; +import com.fasterxml.jackson.annotation.JsonValue; +import org.openapitools.jackson.nullable.JsonNullable; +import java.time.OffsetDateTime; +import javax.validation.Valid; +import javax.validation.constraints.*; +import io.swagger.v3.oas.annotations.media.Schema; + + +import java.util.*; +import javax.annotation.Generated; + +/** + * Banana + */ + +@Generated(value = "org.openapitools.codegen.languages.SpringCodegen") +public class Banana implements Fruit { + + @JsonProperty("length") + private Integer length; + + @JsonProperty("fruitType") + private FruitType fruitType; + + /** + * Default constructor + * @deprecated Use {@link Banana#Banana(Integer)} + */ + @Deprecated + public Banana() { + super(); + } + + /** + * Constructor with only required parameters + */ + public Banana(Integer length) { + this.length = length; + this.fruitType = fruitType; + } + + public Banana length(Integer length) { + this.length = length; + return this; + } + + /** + * Get length + * @return length + */ + @NotNull + @Schema(name = "length", requiredMode = Schema.RequiredMode.REQUIRED) + public Integer getLength() { + return length; + } + + public void setLength(Integer length) { + this.length = length; + } + + public Banana fruitType(FruitType fruitType) { + this.fruitType = fruitType; + return this; + } + + /** + * Get fruitType + * @return fruitType + */ + @NotNull @Valid + @Schema(name = "fruitType", requiredMode = Schema.RequiredMode.REQUIRED) + public FruitType getFruitType() { + return fruitType; + } + + public void setFruitType(FruitType fruitType) { + this.fruitType = fruitType; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + Banana banana = (Banana) o; + return Objects.equals(this.length, banana.length) && + Objects.equals(this.fruitType, banana.fruitType); + } + + @Override + public int hashCode() { + return Objects.hash(length, fruitType); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class Banana {\n"); + sb.append(" length: ").append(toIndentedString(length)).append("\n"); + sb.append(" fruitType: ").append(toIndentedString(fruitType)).append("\n"); + sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } +} + diff --git a/samples/openapi3/server/petstore/spring-boot-oneof/src/main/java/org/openapitools/model/Foo.java b/samples/openapi3/server/petstore/spring-boot-oneof/src/main/java/org/openapitools/model/Foo.java index d63d7287a78b..2a62b82f81de 100644 --- a/samples/openapi3/server/petstore/spring-boot-oneof/src/main/java/org/openapitools/model/Foo.java +++ b/samples/openapi3/server/petstore/spring-boot-oneof/src/main/java/org/openapitools/model/Foo.java @@ -8,7 +8,6 @@ import com.fasterxml.jackson.annotation.JsonSubTypes; import com.fasterxml.jackson.annotation.JsonTypeInfo; import org.openapitools.model.Entity; -import com.fasterxml.jackson.annotation.JsonValue; import org.openapitools.jackson.nullable.JsonNullable; import java.time.OffsetDateTime; import javax.validation.Valid; @@ -25,7 +24,7 @@ @Generated(value = "org.openapitools.codegen.languages.SpringCodegen") -public class Foo extends Entity implements FooRefOrValue, FooRefOrValueEnumMapping { +public class Foo extends Entity implements FooRefOrValue { @JsonProperty("fooPropA") private String fooPropA; @@ -33,9 +32,6 @@ public class Foo extends Entity implements FooRefOrValue, FooRefOrValueEnumMappi @JsonProperty("fooPropB") private String fooPropB; - @JsonProperty("objectType") - private RefOrValueEnum objectType; - /** * Default constructor * @deprecated Use {@link Foo#Foo(String)} @@ -50,7 +46,6 @@ public Foo() { */ public Foo(String atType) { super(atType); - this.objectType = objectType; } public Foo fooPropA(String fooPropA) { @@ -91,25 +86,6 @@ public void setFooPropB(String fooPropB) { this.fooPropB = fooPropB; } - public Foo objectType(RefOrValueEnum objectType) { - this.objectType = objectType; - return this; - } - - /** - * Get objectType - * @return objectType - */ - @NotNull @Valid - @Schema(name = "objectType", requiredMode = Schema.RequiredMode.REQUIRED) - public RefOrValueEnum getObjectType() { - return objectType; - } - - public void setObjectType(RefOrValueEnum objectType) { - this.objectType = objectType; - } - public Foo href(String href) { super.setHref(href); return this; @@ -146,13 +122,12 @@ public boolean equals(Object o) { Foo foo = (Foo) o; return Objects.equals(this.fooPropA, foo.fooPropA) && Objects.equals(this.fooPropB, foo.fooPropB) && - Objects.equals(this.objectType, foo.objectType) && super.equals(o); } @Override public int hashCode() { - return Objects.hash(fooPropA, fooPropB, objectType, super.hashCode()); + return Objects.hash(fooPropA, fooPropB, super.hashCode()); } @Override @@ -162,7 +137,6 @@ public String toString() { sb.append(" ").append(toIndentedString(super.toString())).append("\n"); sb.append(" fooPropA: ").append(toIndentedString(fooPropA)).append("\n"); sb.append(" fooPropB: ").append(toIndentedString(fooPropB)).append("\n"); - sb.append(" objectType: ").append(toIndentedString(objectType)).append("\n"); sb.append("}"); return sb.toString(); } diff --git a/samples/openapi3/server/petstore/spring-boot-oneof/src/main/java/org/openapitools/model/FooRef.java b/samples/openapi3/server/petstore/spring-boot-oneof/src/main/java/org/openapitools/model/FooRef.java index c5f7f93e66a3..f0386a82498c 100644 --- a/samples/openapi3/server/petstore/spring-boot-oneof/src/main/java/org/openapitools/model/FooRef.java +++ b/samples/openapi3/server/petstore/spring-boot-oneof/src/main/java/org/openapitools/model/FooRef.java @@ -8,7 +8,6 @@ import com.fasterxml.jackson.annotation.JsonSubTypes; import com.fasterxml.jackson.annotation.JsonTypeInfo; import org.openapitools.model.EntityRef; -import com.fasterxml.jackson.annotation.JsonValue; import org.openapitools.jackson.nullable.JsonNullable; import java.time.OffsetDateTime; import javax.validation.Valid; @@ -25,14 +24,11 @@ @Generated(value = "org.openapitools.codegen.languages.SpringCodegen") -public class FooRef extends EntityRef implements FooRefOrValue, FooRefOrValueEnumMapping { +public class FooRef extends EntityRef implements FooRefOrValue { @JsonProperty("foorefPropA") private String foorefPropA; - @JsonProperty("objectType") - private RefOrValueEnum objectType; - /** * Default constructor * @deprecated Use {@link FooRef#FooRef(String)} @@ -47,7 +43,6 @@ public FooRef() { */ public FooRef(String atType) { super(atType); - this.objectType = objectType; } public FooRef foorefPropA(String foorefPropA) { @@ -69,25 +64,6 @@ public void setFoorefPropA(String foorefPropA) { this.foorefPropA = foorefPropA; } - public FooRef objectType(RefOrValueEnum objectType) { - this.objectType = objectType; - return this; - } - - /** - * Get objectType - * @return objectType - */ - @NotNull @Valid - @Schema(name = "objectType", requiredMode = Schema.RequiredMode.REQUIRED) - public RefOrValueEnum getObjectType() { - return objectType; - } - - public void setObjectType(RefOrValueEnum objectType) { - this.objectType = objectType; - } - public FooRef name(String name) { super.setName(name); return this; @@ -133,13 +109,12 @@ public boolean equals(Object o) { } FooRef fooRef = (FooRef) o; return Objects.equals(this.foorefPropA, fooRef.foorefPropA) && - Objects.equals(this.objectType, fooRef.objectType) && super.equals(o); } @Override public int hashCode() { - return Objects.hash(foorefPropA, objectType, super.hashCode()); + return Objects.hash(foorefPropA, super.hashCode()); } @Override @@ -148,7 +123,6 @@ public String toString() { sb.append("class FooRef {\n"); sb.append(" ").append(toIndentedString(super.toString())).append("\n"); sb.append(" foorefPropA: ").append(toIndentedString(foorefPropA)).append("\n"); - sb.append(" objectType: ").append(toIndentedString(objectType)).append("\n"); sb.append("}"); return sb.toString(); } diff --git a/samples/openapi3/server/petstore/spring-boot-oneof/src/main/java/org/openapitools/model/FooRefOrValueEnumMapping.java b/samples/openapi3/server/petstore/spring-boot-oneof/src/main/java/org/openapitools/model/Fruit.java similarity index 55% rename from samples/openapi3/server/petstore/spring-boot-oneof/src/main/java/org/openapitools/model/FooRefOrValueEnumMapping.java rename to samples/openapi3/server/petstore/spring-boot-oneof/src/main/java/org/openapitools/model/Fruit.java index bd62a7714e9c..bd1beceb21b8 100644 --- a/samples/openapi3/server/petstore/spring-boot-oneof/src/main/java/org/openapitools/model/FooRefOrValueEnumMapping.java +++ b/samples/openapi3/server/petstore/spring-boot-oneof/src/main/java/org/openapitools/model/Fruit.java @@ -8,9 +8,9 @@ import com.fasterxml.jackson.annotation.JsonSubTypes; import com.fasterxml.jackson.annotation.JsonTypeInfo; import com.fasterxml.jackson.annotation.JsonValue; -import org.openapitools.model.Foo; -import org.openapitools.model.FooRef; -import org.openapitools.model.RefOrValueEnum; +import org.openapitools.model.Apple; +import org.openapitools.model.Banana; +import org.openapitools.model.FruitType; import org.openapitools.jackson.nullable.JsonNullable; import java.time.OffsetDateTime; import javax.validation.Valid; @@ -23,18 +23,18 @@ @JsonIgnoreProperties( - value = "objectType", // ignore manually set objectType, it will be automatically generated by Jackson during serialization - allowSetters = true // allows the objectType to be set during deserialization + value = "fruitType", // ignore manually set fruitType, it will be automatically generated by Jackson during serialization + allowSetters = true // allows the fruitType to be set during deserialization ) -@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "objectType", visible = true) +@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "fruitType", visible = true) @JsonSubTypes({ - @JsonSubTypes.Type(value = Foo.class, name = "Foo"), - @JsonSubTypes.Type(value = FooRef.class, name = "FooRef"), - @JsonSubTypes.Type(value = FooRef.class, name = "REF"), - @JsonSubTypes.Type(value = Foo.class, name = "VALUE") + @JsonSubTypes.Type(value = Apple.class, name = "APPLE"), + @JsonSubTypes.Type(value = Apple.class, name = "Apple"), + @JsonSubTypes.Type(value = Banana.class, name = "BANANA"), + @JsonSubTypes.Type(value = Banana.class, name = "Banana") }) @Generated(value = "org.openapitools.codegen.languages.SpringCodegen") -public interface FooRefOrValueEnumMapping { - public RefOrValueEnum getObjectType(); +public interface Fruit { + public FruitType getFruitType(); } diff --git a/samples/openapi3/server/petstore/spring-boot-oneof/src/main/java/org/openapitools/model/RefOrValueEnum.java b/samples/openapi3/server/petstore/spring-boot-oneof/src/main/java/org/openapitools/model/FruitType.java similarity index 80% rename from samples/openapi3/server/petstore/spring-boot-oneof/src/main/java/org/openapitools/model/RefOrValueEnum.java rename to samples/openapi3/server/petstore/spring-boot-oneof/src/main/java/org/openapitools/model/FruitType.java index 7e1db8861dd6..6955e69433c1 100644 --- a/samples/openapi3/server/petstore/spring-boot-oneof/src/main/java/org/openapitools/model/RefOrValueEnum.java +++ b/samples/openapi3/server/petstore/spring-boot-oneof/src/main/java/org/openapitools/model/FruitType.java @@ -17,19 +17,19 @@ import com.fasterxml.jackson.annotation.JsonValue; /** - * Gets or Sets RefOrValueEnum + * Gets or Sets FruitType */ @Generated(value = "org.openapitools.codegen.languages.SpringCodegen") -public enum RefOrValueEnum { +public enum FruitType { - REF("REF"), + APPLE("APPLE"), - VALUE("VALUE"); + BANANA("BANANA"); private String value; - RefOrValueEnum(String value) { + FruitType(String value) { this.value = value; } @@ -44,8 +44,8 @@ public String toString() { } @JsonCreator - public static RefOrValueEnum fromValue(String value) { - for (RefOrValueEnum b : RefOrValueEnum.values()) { + public static FruitType fromValue(String value) { + for (FruitType b : FruitType.values()) { if (b.value.equals(value)) { return b; } diff --git a/samples/openapi3/server/petstore/spring-boot-oneof/src/main/resources/openapi.yaml b/samples/openapi3/server/petstore/spring-boot-oneof/src/main/resources/openapi.yaml index a62e84c21e7a..ccb24753a016 100644 --- a/samples/openapi3/server/petstore/spring-boot-oneof/src/main/resources/openapi.yaml +++ b/samples/openapi3/server/petstore/spring-boot-oneof/src/main/resources/openapi.yaml @@ -151,27 +151,6 @@ components: - $ref: '#/components/schemas/FooRef' type: object x-one-of-name: FooRefOrValue - RefOrValueEnum: - enum: - - REF - - VALUE - type: string - FooRefOrValueEnumMapping: - discriminator: - mapping: - VALUE: '#/components/schemas/Foo' - REF: '#/components/schemas/FooRef' - propertyName: objectType - oneOf: - - $ref: '#/components/schemas/Foo' - - $ref: '#/components/schemas/FooRef' - properties: - objectType: - $ref: '#/components/schemas/RefOrValueEnum' - required: - - objectType - type: object - x-one-of-name: FooRefOrValueEnumMapping Foo: allOf: - $ref: '#/components/schemas/Entity' @@ -253,3 +232,38 @@ components: toppings: type: string type: object + FruitType: + enum: + - APPLE + - BANANA + type: string + Fruit: + discriminator: + mapping: + APPLE: '#/components/schemas/Apple' + BANANA: '#/components/schemas/Banana' + propertyName: fruitType + oneOf: + - $ref: '#/components/schemas/Apple' + - $ref: '#/components/schemas/Banana' + properties: + fruitType: + $ref: '#/components/schemas/FruitType' + required: + - fruitType + type: object + x-one-of-name: Fruit + Apple: + properties: + seeds: + type: integer + required: + - seeds + type: object + Banana: + properties: + length: + type: integer + required: + - length + type: object diff --git a/samples/openapi3/server/petstore/spring-boot-oneof/src/test/java/org/openapitools/model/FruitJacksonTest.java b/samples/openapi3/server/petstore/spring-boot-oneof/src/test/java/org/openapitools/model/FruitJacksonTest.java new file mode 100644 index 000000000000..925f2d63c52a --- /dev/null +++ b/samples/openapi3/server/petstore/spring-boot-oneof/src/test/java/org/openapitools/model/FruitJacksonTest.java @@ -0,0 +1,51 @@ +package org.openapitools.model; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +import static org.assertj.core.api.Assertions.assertThat; + +@SpringBootTest +class FruitJacksonTest { + + @Autowired + private ObjectMapper objectMapper; + + @Test + void shouldSerializeAndDeserializeApple() throws JsonProcessingException { + int seeds = 7; + Fruit fruit = new Apple(seeds); + + String json = objectMapper.writeValueAsString(fruit); + + assertThat(json).contains("\"fruitType\":\"APPLE\""); + + Fruit result = objectMapper.readValue(json, Fruit.class); + + assertThat(result).isInstanceOfSatisfying(Apple.class, apple -> { + assertThat(apple.getSeeds()).isEqualTo(seeds); + assertThat(apple.getFruitType()).isEqualTo(FruitType.APPLE); + }); + } + + @Test + void shouldSerializeAndDeserializeBanana() throws JsonProcessingException { + int length = 7; + Fruit fruit = new Banana(length); + + String json = objectMapper.writeValueAsString(fruit); + + assertThat(json).contains("\"fruitType\":\"BANANA\""); + + Fruit result = objectMapper.readValue(json, Fruit.class); + + assertThat(result).isInstanceOfSatisfying(Banana.class, banana -> { + assertThat(banana.getLength()).isEqualTo(length); + assertThat(banana.getFruitType()).isEqualTo(FruitType.BANANA); + }); + } + +} \ No newline at end of file From 268da291a8679f090c5419e8b5cb833f726e5eb8 Mon Sep 17 00:00:00 2001 From: Bernie Schelberg Date: Tue, 7 Mar 2023 16:44:06 +1000 Subject: [PATCH 10/12] Remove old generated files --- .../doc/FooRefOrValueEnumMapping.md | 20 -- .../doc/RefOrValueEnum.md | 14 -- .../model/foo_ref_or_value_enum_mapping.dart | 178 ------------------ .../lib/src/model/ref_or_value_enum.dart | 36 ---- .../foo_ref_or_value_enum_mapping_test.dart | 46 ----- .../test/ref_or_value_enum_test.dart | 9 - 6 files changed, 303 deletions(-) delete mode 100644 samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/doc/FooRefOrValueEnumMapping.md delete mode 100644 samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/doc/RefOrValueEnum.md delete mode 100644 samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/lib/src/model/foo_ref_or_value_enum_mapping.dart delete mode 100644 samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/lib/src/model/ref_or_value_enum.dart delete mode 100644 samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/test/foo_ref_or_value_enum_mapping_test.dart delete mode 100644 samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/test/ref_or_value_enum_test.dart diff --git a/samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/doc/FooRefOrValueEnumMapping.md b/samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/doc/FooRefOrValueEnumMapping.md deleted file mode 100644 index 9e2bafba4a9f..000000000000 --- a/samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/doc/FooRefOrValueEnumMapping.md +++ /dev/null @@ -1,20 +0,0 @@ -# openapi.model.FooRefOrValueEnumMapping - -## Load the model package -```dart -import 'package:openapi/api.dart'; -``` - -## Properties -Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- -**objectType** | [**RefOrValueEnum**](RefOrValueEnum.md) | | -**href** | **String** | Hyperlink reference | [optional] -**id** | **String** | unique identifier | [optional] -**atSchemaLocation** | **String** | A URI to a JSON-Schema file that defines additional attributes and relationships | [optional] -**atBaseType** | **String** | When sub-classing, this defines the super-class | [optional] -**atType** | **String** | When sub-classing, this defines the sub-class Extensible name | - -[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) - - diff --git a/samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/doc/RefOrValueEnum.md b/samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/doc/RefOrValueEnum.md deleted file mode 100644 index 41754876638a..000000000000 --- a/samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/doc/RefOrValueEnum.md +++ /dev/null @@ -1,14 +0,0 @@ -# openapi.model.RefOrValueEnum - -## Load the model package -```dart -import 'package:openapi/api.dart'; -``` - -## Properties -Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- - -[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) - - diff --git a/samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/lib/src/model/foo_ref_or_value_enum_mapping.dart b/samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/lib/src/model/foo_ref_or_value_enum_mapping.dart deleted file mode 100644 index 228860679018..000000000000 --- a/samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/lib/src/model/foo_ref_or_value_enum_mapping.dart +++ /dev/null @@ -1,178 +0,0 @@ -// -// AUTO-GENERATED FILE, DO NOT MODIFY! -// - -// ignore_for_file: unused_element -import 'package:openapi/src/model/foo.dart'; -import 'package:openapi/src/model/ref_or_value_enum.dart'; -import 'package:openapi/src/model/foo_ref.dart'; -import 'package:built_value/built_value.dart'; -import 'package:built_value/serializer.dart'; -import 'package:one_of/one_of.dart'; - -part 'foo_ref_or_value_enum_mapping.g.dart'; - -/// FooRefOrValueEnumMapping -/// -/// Properties: -/// * [objectType] -/// * [href] - Hyperlink reference -/// * [id] - unique identifier -/// * [atSchemaLocation] - A URI to a JSON-Schema file that defines additional attributes and relationships -/// * [atBaseType] - When sub-classing, this defines the super-class -/// * [atType] - When sub-classing, this defines the sub-class Extensible name -@BuiltValue() -abstract class FooRefOrValueEnumMapping implements Built { - @BuiltValueField(wireName: r'objectType') - RefOrValueEnum get objectType; - // enum objectTypeEnum { REF, VALUE, }; - - /// One Of [Foo], [FooRef] - OneOf get oneOf; - - static const String discriminatorFieldName = r'objectType'; - - static const Map discriminatorMapping = { - r'REF': FooRef, - r'VALUE': Foo, - }; - - FooRefOrValueEnumMapping._(); - - factory FooRefOrValueEnumMapping([void updates(FooRefOrValueEnumMappingBuilder b)]) = _$FooRefOrValueEnumMapping; - - @BuiltValueHook(initializeBuilder: true) - static void _defaults(FooRefOrValueEnumMappingBuilder b) => b; - - @BuiltValueSerializer(custom: true) - static Serializer get serializer => _$FooRefOrValueEnumMappingSerializer(); -} - -extension FooRefOrValueEnumMappingDiscriminatorExt on FooRefOrValueEnumMapping { - String? get discriminatorValue { - if (this is FooRef) { - return r'REF'; - } - if (this is Foo) { - return r'VALUE'; - } - return null; - } -} -extension FooRefOrValueEnumMappingBuilderDiscriminatorExt on FooRefOrValueEnumMappingBuilder { - String? get discriminatorValue { - if (this is FooRefBuilder) { - return r'REF'; - } - if (this is FooBuilder) { - return r'VALUE'; - } - return null; - } -} - -class _$FooRefOrValueEnumMappingSerializer implements PrimitiveSerializer { - @override - final Iterable types = const [FooRefOrValueEnumMapping, _$FooRefOrValueEnumMapping]; - - @override - final String wireName = r'FooRefOrValueEnumMapping'; - - Iterable _serializeProperties( - Serializers serializers, - FooRefOrValueEnumMapping object, { - FullType specifiedType = FullType.unspecified, - }) sync* { - yield r'objectType'; - yield serializers.serialize( - object.objectType, - specifiedType: const FullType(RefOrValueEnum), - ); - } - - @override - Object serialize( - Serializers serializers, - FooRefOrValueEnumMapping object, { - FullType specifiedType = FullType.unspecified, - }) { - final oneOf = object.oneOf; - final result = _serializeProperties(serializers, object, specifiedType: specifiedType).toList(); - result.addAll(serializers.serialize(oneOf.value, specifiedType: FullType(oneOf.valueType)) as Iterable); - return result; - } - - void _deserializeProperties( - Serializers serializers, - Object serialized, { - FullType specifiedType = FullType.unspecified, - required List serializedList, - required FooRefOrValueEnumMappingBuilder result, - required List unhandled, - }) { - for (var i = 0; i < serializedList.length; i += 2) { - final key = serializedList[i] as String; - final value = serializedList[i + 1]; - switch (key) { - case r'objectType': - final valueDes = serializers.deserialize( - value, - specifiedType: const FullType(RefOrValueEnum), - ) as RefOrValueEnum; - result.objectType = valueDes; - break; - default: - unhandled.add(key); - unhandled.add(value); - break; - } - } - } - - @override - FooRefOrValueEnumMapping deserialize( - Serializers serializers, - Object serialized, { - FullType specifiedType = FullType.unspecified, - }) { - final result = FooRefOrValueEnumMappingBuilder(); - Object? oneOfDataSrc; - final serializedList = (serialized as Iterable).toList(); - final discIndex = serializedList.indexOf(FooRefOrValueEnumMapping.discriminatorFieldName) + 1; - final discValue = serializers.deserialize(serializedList[discIndex], specifiedType: FullType(String)) as String; - final unhandled = []; - _deserializeProperties( - serializers, - serialized, - specifiedType: specifiedType, - serializedList: serializedList, - unhandled: unhandled, - result: result - ); - oneOfDataSrc = unhandled; - final oneOfTypes = [FooRef, Foo, ]; - Object oneOfResult; - Type oneOfType; - switch (discValue) { - case r'REF': - oneOfResult = serializers.deserialize( - oneOfDataSrc, - specifiedType: FullType(FooRef), - ) as FooRef; - oneOfType = FooRef; - break; - case r'VALUE': - oneOfResult = serializers.deserialize( - oneOfDataSrc, - specifiedType: FullType(Foo), - ) as Foo; - oneOfType = Foo; - break; - default: - throw UnsupportedError("Couldn't deserialize oneOf for the discriminator value: ${discValue}"); - } - result.oneOf = OneOfDynamic(typeIndex: oneOfTypes.indexOf(oneOfType), types: oneOfTypes, value: oneOfResult); - return result.build(); - } -} - diff --git a/samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/lib/src/model/ref_or_value_enum.dart b/samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/lib/src/model/ref_or_value_enum.dart deleted file mode 100644 index 27798ad11590..000000000000 --- a/samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/lib/src/model/ref_or_value_enum.dart +++ /dev/null @@ -1,36 +0,0 @@ -// -// AUTO-GENERATED FILE, DO NOT MODIFY! -// - -// ignore_for_file: unused_element -import 'package:built_collection/built_collection.dart'; -import 'package:built_value/built_value.dart'; -import 'package:built_value/serializer.dart'; - -part 'ref_or_value_enum.g.dart'; - -class RefOrValueEnum extends EnumClass { - - @BuiltValueEnumConst(wireName: r'REF') - static const RefOrValueEnum REF = _$REF; - @BuiltValueEnumConst(wireName: r'VALUE') - static const RefOrValueEnum VALUE = _$VALUE; - @BuiltValueEnumConst(wireName: r'unknown_default_open_api', fallback: true) - static const RefOrValueEnum unknownDefaultOpenApi = _$unknownDefaultOpenApi; - - static Serializer get serializer => _$refOrValueEnumSerializer; - - const RefOrValueEnum._(String name): super(name); - - static BuiltSet get values => _$values; - static RefOrValueEnum valueOf(String name) => _$valueOf(name); -} - -/// Optionally, enum_class can generate a mixin to go with your enum for use -/// with Angular. It exposes your enum constants as getters. So, if you mix it -/// in to your Dart component class, the values become available to the -/// corresponding Angular template. -/// -/// Trigger mixin generation by writing a line like this one next to your enum. -abstract class RefOrValueEnumMixin = Object with _$RefOrValueEnumMixin; - diff --git a/samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/test/foo_ref_or_value_enum_mapping_test.dart b/samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/test/foo_ref_or_value_enum_mapping_test.dart deleted file mode 100644 index c370a0ffcb4a..000000000000 --- a/samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/test/foo_ref_or_value_enum_mapping_test.dart +++ /dev/null @@ -1,46 +0,0 @@ -import 'package:test/test.dart'; -import 'package:openapi/openapi.dart'; - -// tests for FooRefOrValueEnumMapping -void main() { - final instance = FooRefOrValueEnumMappingBuilder(); - // TODO add properties to the builder and call build() - - group(FooRefOrValueEnumMapping, () { - // RefOrValueEnum objectType - test('to test the property `objectType`', () async { - // TODO - }); - - // Hyperlink reference - // String href - test('to test the property `href`', () async { - // TODO - }); - - // unique identifier - // String id - test('to test the property `id`', () async { - // TODO - }); - - // A URI to a JSON-Schema file that defines additional attributes and relationships - // String atSchemaLocation - test('to test the property `atSchemaLocation`', () async { - // TODO - }); - - // When sub-classing, this defines the super-class - // String atBaseType - test('to test the property `atBaseType`', () async { - // TODO - }); - - // When sub-classing, this defines the sub-class Extensible name - // String atType - test('to test the property `atType`', () async { - // TODO - }); - - }); -} diff --git a/samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/test/ref_or_value_enum_test.dart b/samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/test/ref_or_value_enum_test.dart deleted file mode 100644 index 71a19dfe0234..000000000000 --- a/samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/test/ref_or_value_enum_test.dart +++ /dev/null @@ -1,9 +0,0 @@ -import 'package:test/test.dart'; -import 'package:openapi/openapi.dart'; - -// tests for RefOrValueEnum -void main() { - - group(RefOrValueEnum, () { - }); -} From bb7bbd990d09d38aceedf47e01c0d4a630ac785c Mon Sep 17 00:00:00 2001 From: Bernie Schelberg Date: Wed, 21 Jun 2023 11:18:31 +1000 Subject: [PATCH 11/12] Generate samples --- .../src/main/java/org/openapitools/model/Apple.java | 9 ++------- .../src/main/java/org/openapitools/model/Banana.java | 9 ++------- 2 files changed, 4 insertions(+), 14 deletions(-) diff --git a/samples/openapi3/server/petstore/spring-boot-oneof/src/main/java/org/openapitools/model/Apple.java b/samples/openapi3/server/petstore/spring-boot-oneof/src/main/java/org/openapitools/model/Apple.java index 3aa2e0c8b4c7..e79df471e6ec 100644 --- a/samples/openapi3/server/petstore/spring-boot-oneof/src/main/java/org/openapitools/model/Apple.java +++ b/samples/openapi3/server/petstore/spring-boot-oneof/src/main/java/org/openapitools/model/Apple.java @@ -25,17 +25,10 @@ @Generated(value = "org.openapitools.codegen.languages.SpringCodegen") public class Apple implements Fruit { - @JsonProperty("seeds") private Integer seeds; - @JsonProperty("fruitType") private FruitType fruitType; - /** - * Default constructor - * @deprecated Use {@link Apple#Apple(Integer)} - */ - @Deprecated public Apple() { super(); } @@ -59,6 +52,7 @@ public Apple seeds(Integer seeds) { */ @NotNull @Schema(name = "seeds", requiredMode = Schema.RequiredMode.REQUIRED) + @JsonProperty("seeds") public Integer getSeeds() { return seeds; } @@ -78,6 +72,7 @@ public Apple fruitType(FruitType fruitType) { */ @NotNull @Valid @Schema(name = "fruitType", requiredMode = Schema.RequiredMode.REQUIRED) + @JsonProperty("fruitType") public FruitType getFruitType() { return fruitType; } diff --git a/samples/openapi3/server/petstore/spring-boot-oneof/src/main/java/org/openapitools/model/Banana.java b/samples/openapi3/server/petstore/spring-boot-oneof/src/main/java/org/openapitools/model/Banana.java index 92ae7b556b9c..22e34a29d479 100644 --- a/samples/openapi3/server/petstore/spring-boot-oneof/src/main/java/org/openapitools/model/Banana.java +++ b/samples/openapi3/server/petstore/spring-boot-oneof/src/main/java/org/openapitools/model/Banana.java @@ -25,17 +25,10 @@ @Generated(value = "org.openapitools.codegen.languages.SpringCodegen") public class Banana implements Fruit { - @JsonProperty("length") private Integer length; - @JsonProperty("fruitType") private FruitType fruitType; - /** - * Default constructor - * @deprecated Use {@link Banana#Banana(Integer)} - */ - @Deprecated public Banana() { super(); } @@ -59,6 +52,7 @@ public Banana length(Integer length) { */ @NotNull @Schema(name = "length", requiredMode = Schema.RequiredMode.REQUIRED) + @JsonProperty("length") public Integer getLength() { return length; } @@ -78,6 +72,7 @@ public Banana fruitType(FruitType fruitType) { */ @NotNull @Valid @Schema(name = "fruitType", requiredMode = Schema.RequiredMode.REQUIRED) + @JsonProperty("fruitType") public FruitType getFruitType() { return fruitType; } From ac76b0c854a006bb9183e1ff727aeabb54bc1e33 Mon Sep 17 00:00:00 2001 From: Bernie Schelberg Date: Tue, 4 Jul 2023 09:25:59 +1000 Subject: [PATCH 12/12] Generate samples --- .../lib/src/model/fruit.dart | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/lib/src/model/fruit.dart b/samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/lib/src/model/fruit.dart index f4e0e74496ce..31b61361de5e 100644 --- a/samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/lib/src/model/fruit.dart +++ b/samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/lib/src/model/fruit.dart @@ -137,16 +137,7 @@ class _$FruitSerializer implements PrimitiveSerializer { final serializedList = (serialized as Iterable).toList(); final discIndex = serializedList.indexOf(Fruit.discriminatorFieldName) + 1; final discValue = serializers.deserialize(serializedList[discIndex], specifiedType: FullType(String)) as String; - final unhandled = []; - _deserializeProperties( - serializers, - serialized, - specifiedType: specifiedType, - serializedList: serializedList, - unhandled: unhandled, - result: result - ); - oneOfDataSrc = unhandled; + oneOfDataSrc = serialized; final oneOfTypes = [Apple, Banana, ]; Object oneOfResult; Type oneOfType;