Created by: spacether
This PR adds composed schema (allOf/oneOf/anyOf) support to the python-experimental generator. All composed schema instances will now store instances of their composed schema models under the hood, then use them when we get attributes, set attributes, or convert the model instance to a dict for serialization. Common model methods have been moved into parent classes with a net reduction of -3,800 lines
Test Verification
In depth tests on the Dog allOf class have been added at:
A test showing that allOf parameters are accessible on an instance of Dog is at:
Circular Reference Problem and Solution
Note: class names in dataTypes must look like pet.Pet so we can load modules with lines like
from package.models import pet
at the top of the module, then we can use pet.Pet as the data type later in the model definition.
This is specifically needed for models with composed schemas because those models require circular references.
For example: Animal uses a Cat discriminator, so the animal module imports cat The cat module uses allOf Animal in its composed schema definition so it imports animal
The only way to make the circular imports work is using the below two techniques:
- in cat load the animal module in with a try except import error catch, where if we get an import error we will set the animal variable to the partially loaded animal module in sys
- delay our usage of the composed schemas (animal.Animal) by putting them in the model _composed_schemas method. That way, the code is not run until the method is invoked. If we put animal.Animal into Cat's module level constants, because the animal module is not yet fully loaded, animal.Animal does not exist and the code would not run.
Related Issues
This may fix the below issues if the end users use the python-experimental generator:
- https://github.com/OpenAPITools/openapi-generator/issues/1662
- https://github.com/OpenAPITools/openapi-generator/issues/623
Potential Future Work
If this PR is accepted, later on I can submit a PR adding a python-experimental client example for the openapi spec demonstrating that oneOf and anyOf also work.
-
Read the contribution guidelines. -
If contributing template-only or documentation-only changes which will change sample output, build the project before. -
Run the shell script(s) under ./bin/
(or Windows batch scripts under.\bin\windows
) to update Petstore samples related to your fix. This is important, as CI jobs will verify all generator outputs of your HEAD commit, and these must match the expectations made by your contribution. You only need to run./bin/{LANG}-petstore.sh
,./bin/openapi3/{LANG}-petstore.sh
if updating the code or mustache templates for a language ({LANG}
) (e.g. php, ruby, python, etc). -
File the PR against the correct branch: master
,4.3.x
,5.0.x
. Default:master
. -
Copy the technical committee to review the pull request if your PR is targeting a particular programming language.
@taxpon (2017/07) @frol (2017/07) @mbohlool (2017/07) @cbornet (2017/09) @kenjones-cisco (2017/11) @tomplus (2018/10) @Jyhess (2019/01) @slash-arun (2019/11)
Authors of related work: @rienafairefr per https://github.com/OpenAPITools/openapi-generator/pull/2170