Skip to content

Commit

Permalink
Fixes serialization of array items in model_to_dict [python] (#9153)
Browse files Browse the repository at this point in the history
* Adds tests of endpoint with inline and refed model

* Regen samples

* Samples regenerated
  • Loading branch information
spacether authored Apr 1, 2021
1 parent 7bf792a commit fc58ade
Show file tree
Hide file tree
Showing 22 changed files with 1,290 additions and 37 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -1211,13 +1211,19 @@ def model_to_dict(model_instance, serialize=True):
# exist in attribute_map
attr = model_instance.attribute_map.get(attr, attr)
if isinstance(value, list):
if not value or isinstance(value[0], PRIMITIVE_TYPES):
# empty list or primitive types
result[attr] = value
elif isinstance(value[0], ModelSimple):
result[attr] = [x.value for x in value]
else:
result[attr] = [model_to_dict(x, serialize=serialize) for x in value]
if not value:
# empty list or None
result[attr] = value
else:
res = []
for v in value:
if isinstance(v, PRIMITIVE_TYPES) or v is None:
res.append(v)
elif isinstance(v, ModelSimple):
res.append(v.value)
else:
res.append(model_to_dict(v, serialize=serialize))
result[attr] = res
elif isinstance(value, dict):
result[attr] = dict(map(
lambda item: (item[0],
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1286,6 +1286,66 @@ paths:
application/json:
schema:
$ref: '#/components/schemas/HealthCheckResult'
/fake/getInlineAdditionalPropertiesRefPayload:
get:
tags:
- fake
operationId: getInlineAdditionalPropertiesRefPayload
responses:
200:
description: InlineAdditionalPropertiesRefPayload
content:
application/json:
schema:
$ref: '#/components/schemas/InlineAdditionalPropertiesRefPayload'
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/InlineAdditionalPropertiesRefPayload'
/fake/getInlineAdditionalPropertiesPayload:
get:
tags:
- fake
operationId: getInlineAdditionalPropertiesPayload
responses:
200:
description: InlineAdditionalPropertiesPayload
content:
application/json:
schema:
description: this payload is used for verification that some model_to_dict issues are fixed
type: object
properties:
arrayData:
type: array
nullable: true
items:
type: object
properties:
labels:
type: array
items:
type: string
nullable: true
requestBody:
content:
application/json:
schema:
description: this payload is used for verification that some model_to_dict issues are fixed
type: object
properties:
arrayData:
type: array
nullable: true
items:
type: object
properties:
labels:
type: array
items:
type: string
nullable: true
servers:
- url: 'http://{server}.swagger.io:{port}/v2'
description: petstore server
Expand Down Expand Up @@ -2318,3 +2378,18 @@ components:
SomeObject:
allOf:
- $ref: '#/components/schemas/ObjectInterface'
InlineAdditionalPropertiesRefPayload:
description: this payload is used for verification that some model_to_dict issues are fixed
type: object
properties:
arrayData:
type: array
nullable: true
items:
type: object
properties:
labels:
type: array
items:
type: string
nullable: true
20 changes: 13 additions & 7 deletions samples/client/petstore/python/petstore_api/model_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -1493,13 +1493,19 @@ def model_to_dict(model_instance, serialize=True):
# exist in attribute_map
attr = model_instance.attribute_map.get(attr, attr)
if isinstance(value, list):
if not value or isinstance(value[0], PRIMITIVE_TYPES):
# empty list or primitive types
result[attr] = value
elif isinstance(value[0], ModelSimple):
result[attr] = [x.value for x in value]
else:
result[attr] = [model_to_dict(x, serialize=serialize) for x in value]
if not value:
# empty list or None
result[attr] = value
else:
res = []
for v in value:
if isinstance(v, PRIMITIVE_TYPES) or v is None:
res.append(v)
elif isinstance(v, ModelSimple):
res.append(v.value)
else:
res.append(model_to_dict(v, serialize=serialize))
result[attr] = res
elif isinstance(value, dict):
result[attr] = dict(map(
lambda item: (item[0],
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1493,13 +1493,19 @@ def model_to_dict(model_instance, serialize=True):
# exist in attribute_map
attr = model_instance.attribute_map.get(attr, attr)
if isinstance(value, list):
if not value or isinstance(value[0], PRIMITIVE_TYPES):
# empty list or primitive types
result[attr] = value
elif isinstance(value[0], ModelSimple):
result[attr] = [x.value for x in value]
else:
result[attr] = [model_to_dict(x, serialize=serialize) for x in value]
if not value:
# empty list or None
result[attr] = value
else:
res = []
for v in value:
if isinstance(v, PRIMITIVE_TYPES) or v is None:
res.append(v)
elif isinstance(v, ModelSimple):
res.append(v.value)
else:
res.append(model_to_dict(v, serialize=serialize))
result[attr] = res
elif isinstance(value, dict):
result[attr] = dict(map(
lambda item: (item[0],
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1493,13 +1493,19 @@ def model_to_dict(model_instance, serialize=True):
# exist in attribute_map
attr = model_instance.attribute_map.get(attr, attr)
if isinstance(value, list):
if not value or isinstance(value[0], PRIMITIVE_TYPES):
# empty list or primitive types
result[attr] = value
elif isinstance(value[0], ModelSimple):
result[attr] = [x.value for x in value]
else:
result[attr] = [model_to_dict(x, serialize=serialize) for x in value]
if not value:
# empty list or None
result[attr] = value
else:
res = []
for v in value:
if isinstance(v, PRIMITIVE_TYPES) or v is None:
res.append(v)
elif isinstance(v, ModelSimple):
res.append(v.value)
else:
res.append(model_to_dict(v, serialize=serialize))
result[attr] = res
elif isinstance(value, dict):
result[attr] = dict(map(
lambda item: (item[0],
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ docs/EnumTest.md
docs/EquilateralTriangle.md
docs/FakeApi.md
docs/FakeClassnameTags123Api.md
docs/FakeGetInlineAdditionalPropertiesPayloadArrayData.md
docs/File.md
docs/FileSchemaTestClass.md
docs/Foo.md
Expand All @@ -49,6 +50,8 @@ docs/GmFruit.md
docs/GrandparentAnimal.md
docs/HasOnlyReadOnly.md
docs/HealthCheckResult.md
docs/InlineAdditionalPropertiesRefPayload.md
docs/InlineObject6.md
docs/InlineResponseDefault.md
docs/IntegerEnum.md
docs/IntegerEnumOneValue.md
Expand Down Expand Up @@ -142,6 +145,7 @@ petstore_api/model/enum_arrays.py
petstore_api/model/enum_class.py
petstore_api/model/enum_test.py
petstore_api/model/equilateral_triangle.py
petstore_api/model/fake_get_inline_additional_properties_payload_array_data.py
petstore_api/model/file.py
petstore_api/model/file_schema_test_class.py
petstore_api/model/foo.py
Expand All @@ -152,6 +156,8 @@ petstore_api/model/gm_fruit.py
petstore_api/model/grandparent_animal.py
petstore_api/model/has_only_read_only.py
petstore_api/model/health_check_result.py
petstore_api/model/inline_additional_properties_ref_payload.py
petstore_api/model/inline_object6.py
petstore_api/model/inline_response_default.py
petstore_api/model/integer_enum.py
petstore_api/model/integer_enum_one_value.py
Expand Down
5 changes: 5 additions & 0 deletions samples/openapi3/client/petstore/python/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,8 @@ Class | Method | HTTP request | Description
*FakeApi* | [**download_attachment**](docs/FakeApi.md#download_attachment) | **GET** /{fileName} | downloads a file using Content-Disposition
*FakeApi* | [**enum_test**](docs/FakeApi.md#enum_test) | **POST** /fake/refs/enum-test | Object contains enum properties and array properties containing enums
*FakeApi* | [**fake_health_get**](docs/FakeApi.md#fake_health_get) | **GET** /fake/health | Health check endpoint
*FakeApi* | [**get_inline_additional_properties_payload**](docs/FakeApi.md#get_inline_additional_properties_payload) | **GET** /fake/getInlineAdditionalPropertiesPayload |
*FakeApi* | [**get_inline_additional_properties_ref_payload**](docs/FakeApi.md#get_inline_additional_properties_ref_payload) | **GET** /fake/getInlineAdditionalPropertiesRefPayload |
*FakeApi* | [**mammal**](docs/FakeApi.md#mammal) | **POST** /fake/refs/mammal |
*FakeApi* | [**number_with_validations**](docs/FakeApi.md#number_with_validations) | **POST** /fake/refs/number |
*FakeApi* | [**object_model_with_ref_props**](docs/FakeApi.md#object_model_with_ref_props) | **POST** /fake/refs/object_model_with_ref_props |
Expand Down Expand Up @@ -165,6 +167,7 @@ Class | Method | HTTP request | Description
- [EnumClass](docs/EnumClass.md)
- [EnumTest](docs/EnumTest.md)
- [EquilateralTriangle](docs/EquilateralTriangle.md)
- [FakeGetInlineAdditionalPropertiesPayloadArrayData](docs/FakeGetInlineAdditionalPropertiesPayloadArrayData.md)
- [File](docs/File.md)
- [FileSchemaTestClass](docs/FileSchemaTestClass.md)
- [Foo](docs/Foo.md)
Expand All @@ -175,6 +178,8 @@ Class | Method | HTTP request | Description
- [GrandparentAnimal](docs/GrandparentAnimal.md)
- [HasOnlyReadOnly](docs/HasOnlyReadOnly.md)
- [HealthCheckResult](docs/HealthCheckResult.md)
- [InlineAdditionalPropertiesRefPayload](docs/InlineAdditionalPropertiesRefPayload.md)
- [InlineObject6](docs/InlineObject6.md)
- [InlineResponseDefault](docs/InlineResponseDefault.md)
- [IntegerEnum](docs/IntegerEnum.md)
- [IntegerEnumOneValue](docs/IntegerEnumOneValue.md)
Expand Down
Loading

0 comments on commit fc58ade

Please sign in to comment.