Skip to content
GitLab
Projects Groups Snippets
  • /
  • Help
    • Help
    • Support
    • Community forum
    • Submit feedback
    • Contribute to GitLab
  • Sign in / Register
  • O openapi-generator
  • Project information
    • Project information
    • Activity
    • Labels
    • Members
  • Repository
    • Repository
    • Files
    • Commits
    • Branches
    • Tags
    • Contributors
    • Graph
    • Compare
  • Issues 3,476
    • Issues 3,476
    • List
    • Boards
    • Service Desk
    • Milestones
  • Merge requests 402
    • Merge requests 402
  • CI/CD
    • CI/CD
    • Pipelines
    • Jobs
    • Schedules
  • Deployments
    • Deployments
    • Environments
    • Releases
  • Packages and registries
    • Packages and registries
    • Package Registry
    • Infrastructure Registry
  • Monitor
    • Monitor
    • Incidents
  • Analytics
    • Analytics
    • Value stream
    • CI/CD
    • Repository
  • Wiki
    • Wiki
  • Snippets
    • Snippets
  • Activity
  • Graph
  • Create a new issue
  • Jobs
  • Commits
  • Issue Boards
Collapse sidebar
  • OpenAPI Tools
  • openapi-generator
  • Merge requests
  • !4446

[Python] Adds allOf/oneOf/anyOf composed models

  • Review changes

  • Download
  • Email patches
  • Plain diff
Merged Administrator requested to merge github/fork/spacether/allof_anyof_oneof_addition into master Nov 10, 2019
  • Overview 0
  • Commits 3
  • Pipelines 0
  • Changes 194

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:

  • https://github.com/spacether/openapi-generator/blob/allof_anyof_oneof_addition/samples/client/petstore/python-experimental/test/test_dog.py#L33

A test showing that allOf parameters are accessible on an instance of Dog is at:

  • https://github.com/spacether/openapi-generator/blob/allof_anyof_oneof_addition/samples/client/petstore/python-experimental/tests/test_deserialization.py#L120

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:

  1. 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
  2. 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

Assignee
Assign to
Reviewers
Request review from
Time tracking
Source branch: github/fork/spacether/allof_anyof_oneof_addition