[PYTHON] GetItem not working for Client generated allOf model and broken since 5.2.0 (#12239)

* I feel the issue is due to the creation of self._var_name_to_model_instances while doing the deserialization of the data.

Earlier the Python SDK code was using get_var_name_to_model_instances function which was adding var name to model instances that contain it. So <class 'openapi_client.model.stream_options_all_of'> will not part of mapping in self._var_name_to_model_instances for variable name stream_options.

Now with the latest Python SDK code following is the way through which var_name_to_model_instances is created:

    for prop_name in model_args:
        if prop_name not in discarded_args:
            var_name_to_model_instances[prop_name] = [self] + composed_instances
Now as we can see that the var_name_to_model_instances is populated with self and composed_instance which will also contain stream_options_all_of as a composed instance and there will be no check that if stream_options is present in composed_instances or not.

As there is no attribute_mapping found for stream_options in stream_options_all_of, the type for stream_options will be treated as dict for mapping stream_options_all_of as mentioned by @Chekov2k.

So what I suggest is the following code:

    for prop_name in model_args:
        if prop_name not in discarded_args:
           var_name_to_model_instances[prop_name] = [self] + list(
                filter(
                    lambda x: prop_name in x.openapi_types, composed_instances))
This way we can check if the property name is present in that composed instance or not. If it's okay for @spacether I can raise a PR for this.

* [get_item_all_of_bug]
Added samples, test cases to validate all_of schema.

* [getiem_all_of_bug]

Updated docs and samples.

* [getiem_all_of_bug]

Updated test cases, docs and samples.
This commit is contained in:
Akhil Nair
2022-05-28 09:39:48 +05:30
committed by GitHub
parent 76eddeb713
commit e823290c8f
29 changed files with 1646 additions and 20 deletions

View File

@@ -0,0 +1,35 @@
"""
OpenAPI Petstore
This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\ # noqa: E501
The version of the OpenAPI document: 1.0.0
Generated by: https://openapi-generator.tech
"""
import sys
import unittest
import petstore_api
from petstore_api.model.egress_threshold_options import EgressThresholdOptions
class TestEgressThresholdOptions(unittest.TestCase):
"""EgressThresholdOptions unit test stubs"""
def setUp(self):
pass
def tearDown(self):
pass
def testEgressThresholdOptions(self):
"""Test EgressThresholdOptions"""
# FIXME: construct object with mandatory attributes with example values
# model = EgressThresholdOptions() # noqa: E501
pass
if __name__ == '__main__':
unittest.main()

View File

@@ -0,0 +1,37 @@
"""
OpenAPI Petstore
This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\ # noqa: E501
The version of the OpenAPI document: 1.0.0
Generated by: https://openapi-generator.tech
"""
import sys
import unittest
import petstore_api
from petstore_api.model.publish_options_publish import PublishOptionsPublish
globals()['PublishOptionsPublish'] = PublishOptionsPublish
from petstore_api.model.publish_options import PublishOptions
class TestPublishOptions(unittest.TestCase):
"""PublishOptions unit test stubs"""
def setUp(self):
pass
def tearDown(self):
pass
def testPublishOptions(self):
"""Test PublishOptions"""
# FIXME: construct object with mandatory attributes with example values
# model = PublishOptions() # noqa: E501
pass
if __name__ == '__main__':
unittest.main()

View File

@@ -0,0 +1,35 @@
"""
OpenAPI Petstore
This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\ # noqa: E501
The version of the OpenAPI document: 1.0.0
Generated by: https://openapi-generator.tech
"""
import sys
import unittest
import petstore_api
from petstore_api.model.publish_options_publish import PublishOptionsPublish
class TestPublishOptionsPublish(unittest.TestCase):
"""PublishOptionsPublish unit test stubs"""
def setUp(self):
pass
def tearDown(self):
pass
def testPublishOptionsPublish(self):
"""Test PublishOptionsPublish"""
# FIXME: construct object with mandatory attributes with example values
# model = PublishOptionsPublish() # noqa: E501
pass
if __name__ == '__main__':
unittest.main()

View File

@@ -0,0 +1,41 @@
"""
OpenAPI Petstore
This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\ # noqa: E501
The version of the OpenAPI document: 1.0.0
Generated by: https://openapi-generator.tech
"""
import sys
import unittest
import petstore_api
from petstore_api.model.egress_threshold_options import EgressThresholdOptions
from petstore_api.model.publish_options import PublishOptions
from petstore_api.model.publish_options_publish import PublishOptionsPublish
globals()['EgressThresholdOptions'] = EgressThresholdOptions
globals()['PublishOptions'] = PublishOptions
globals()['PublishOptionsPublish'] = PublishOptionsPublish
from petstore_api.model.stream_options import StreamOptions
class TestStreamOptions(unittest.TestCase):
"""StreamOptions unit test stubs"""
def setUp(self):
pass
def tearDown(self):
pass
def testStreamOptions(self):
"""Test StreamOptions"""
# FIXME: construct object with mandatory attributes with example values
# model = StreamOptions() # noqa: E501
pass
if __name__ == '__main__':
unittest.main()