Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Correct allOf with only one child schema (no discriminator) #6901

Merged
merged 5 commits into from
Sep 1, 2020

Conversation

wing328
Copy link
Member

@wing328 wing328 commented Jul 9, 2020

Correct allOf with only one child schema (no discriminator) by removing the old (incorrect) behavior.

Now it works correctly as model composition.

cc @OpenAPITools/generator-core-team

PR checklist

  • Read the contribution guidelines.
  • If contributing template-only or documentation-only changes which will change sample output, build the project beforehand.
  • Run the shell script ./bin/generate-samples.shto update all Petstore samples related to your fix. This is important, as CI jobs will verify all generator outputs of your HEAD commit as it would merge with master. These must match the expectations made by your contribution. You may regenerate an individual generator by passing the relevant config(s) as an argument to the script, for example ./bin/generate-samples.sh bin/config/java*. For Windows users, please run the script in Git BASH.
  • File the PR against the correct branch: master
  • Copy the technical committee to review the pull request if your PR is targeting a particular programming language.

@m-mohr
Copy link

m-mohr commented Jul 9, 2020

How to do enable inheritance without discriminator?

@wing328
Copy link
Member Author

wing328 commented Jul 9, 2020

Don't think you can do that according to the spec

The OpenAPI Specification allows combining and extending model definitions using the allOf property of JSON Schema, in effect offering model composition. allOf takes an array of object definitions that are validated independently but together compose a single object.

While composition offers model extensibility, it does not imply a hierarchy between the models. To support polymorphism, the OpenAPI Specification adds the discriminator field

Ref: https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.3.md#composition-and-inheritance-polymorphism

// TOOD to be removed in 6.x release
LOGGER.warn("[deprecated] inheritance without use of 'discriminator.propertyName' has been deprecated" +
" in the 5.x release. Composed schema name: {}. Title: {}",
composedSchema.getName(), composedSchema.getTitle());
}
} else {
// not a ref, doing nothing, except counting the number of times the 'null' type
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This block is no longer needed at all right? It only increments an unused variable nullSchemaChildrenCount

Copy link
Contributor

@spacether spacether left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good

@@ -1239,8 +1237,10 @@ public static String getParentName(ComposedSchema composedSchema, Map<String, Sc
return parentName;
} else {
// not a parent since discriminator.propertyName is not set
hasAmbiguousParents = true;
refedWithoutDiscriminator.add(parentName);
// TOOD to be removed in 6.x release
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

:-) Misspelling: TOOD --> TODO

This case indicates composition, not inheritance right? Especially in the edge case of an allOf reference to a model with no properties nor additionalProperties So why is it being deprecated? This seems like a valid use case for composition.

The log warning message seems to indicate that I will not be able to do composition in this way. Is that what is intended?

@wing328
Copy link
Member Author

wing328 commented Jul 12, 2020

@jeff9finger I've pushed some update to minimize the change and only fix the incorrect behavior. Please have another look when you've time.

@typhoon2k
Copy link
Contributor

typhoon2k commented Aug 10, 2020

Hi @wing328,

as far as I understand the only change applied here is change in log message content (and log level).
We have a very simple case:

base_schemas.yaml

baseSchema:
  title: BaseSchema
  type: object
  description: Base schema description
  properties:
    property1:
      type: string
    property2:
      type: string

extension_schemas.yaml:

extensionSchema
  title: ExtensionSchema
  type: object
  description: Extension schema description
  allOf:
    - $ref: 'base_schemas.yaml#/baseSchema'
  example:
    property1: 'value1'
    property2: 'value2'

With this definition (we have only one child schema here) we are still getting inheritance instead of composition and generation log contains a lot of WARN (previously)/INFO (with this update) messages.

So, behavior is not fixed for us...

best regards,
ty

@typhoon2k
Copy link
Contributor

typhoon2k commented Aug 10, 2020

I've investigated this a bit firther and it seems that some generators are using own logic for allOf cases. In our case we are using typescript-axios and plantuml generators and both are generating it as inheritance (for example, typescript-axios generator is using special allOf template).

But what worries me is that we are getting many many "inheritance without use of 'discriminator.propertyName' has been deprecated in the 5.x release" messages in generator log. Do we need to produce this spam now?

Otherwise looks good for me.

best regards,
ty

@typhoon2k
Copy link
Contributor

Hi @wing328 ,

what are the plans for this change? Can we get it in master sometime soon?

ty

P.S. It would be great to get rid of "inheritance without use of 'discriminator.propertyName' has been deprecated in the 5.x release" spamming message as well before merging this PR.

@jimschubert
Copy link
Member

@typhoon2k I don't think we can add a breaking change and deprecation without informing the user.

@wing328 can you wrap the above message in once as other spammy logs in ModelUtils? This way, users could tweak logging by changing the system properties and defaults:

  • -Dorg.openapitools.codegen.utils.oncelogger.cachesize=200
  • -Dorg.openapitools.codegen.utils.oncelogger.expiry=2000

Copy link
Member

@jimschubert jimschubert left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@typhoon2k
Copy link
Contributor

typhoon2k commented Aug 31, 2020

@jimschubert , I just tried to play locally with once logger. I've made the following change to logging code:

            once(LOGGER).info("[deprecated] inheritance without use of 'discriminator.propertyName' has been deprecated" +
                    " in the 5.x release. Composed schema name: " + composedSchema.getName() + ". Title: " + composedSchema.getTitle());

With this change I still get spam in logs. Do I need to configure once logger somehow additionally?

Update:
I understand why - composed schema name and title are different each time in our case. But as we have many of them, then we get a lot of such messages in logs.

So it would be nice to include message without composed schema name and title to reduce spam in logs.

@jimschubert
Copy link
Member

Excellent suggestion. I'll go ahead and merge this, then change the info log to be generic and add a debug log with the name and title.

@jimschubert jimschubert merged commit 972120c into master Sep 1, 2020
@jimschubert jimschubert deleted the fix-allof-single branch September 1, 2020 01:47
@jimschubert jimschubert restored the fix-allof-single branch September 1, 2020 02:45
jimschubert added a commit that referenced this pull request Sep 1, 2020
@jimschubert
Copy link
Member

@wing328 I'd merged this, but had to revert via #7323 as it caused all CI checks to fail in master. If you have a chance, could you merge master and take a look? It failed on JavaClientCodegenTest#testAllowModelWithNoProperties and I didn't readily see a way to allow for empty/marker classes on this change as the spec allows.

jimschubert added a commit that referenced this pull request Sep 2, 2020
* master: (89 commits)
  add structPrefix support to go-experimental (#7327)
  Add a link to SmartHR Tech Blog (#7324)
  Revert "Correct allOf with only one child schema (no discriminator)" (#7323)
  Correct allOf with only one child schema (no discriminator) (#6901)
  [Go]: Interface definitions for api functions (#5914)
  Update bug_report.md (#7320)
  update samples
  [Java][Client] Use java8 OffsetDateTime for clients (#7190)
  [java] Intro openApiNullable property to enable/disable OpenAPI Jackson Nullable library (#6154)
  [Spring Boot] update dependencies, mark java8 option as deprecated (#7306)
  Remove dot in golang type (#7307)
  [doc] Document usage of post-process file feature (#7315)
  fix http bear auth documentation for go clinets (#7312)
  [Extensions][Go][Java] Test x-auth-id-alias (#6642)
  [php-slim4] Move config to a separate file (#6971)
  [C][Client][Clang Static Analyzer] Remove the useless free operation for (#7309)
  Fix typescript-node generation when only models are generated (#7127)
  update spring config to use java8 (#7308)
  [C][Client][Clang Static Analyzer] Fix uninitialized argument value (#7305)
  [Java] remove deprecated jackson classes (#7304)
  ...
jimschubert added a commit to zippolyte/openapi-generator that referenced this pull request Sep 2, 2020
* master: (984 commits)
  add structPrefix support to go-experimental (OpenAPITools#7327)
  Add a link to SmartHR Tech Blog (OpenAPITools#7324)
  Revert "Correct allOf with only one child schema (no discriminator)" (OpenAPITools#7323)
  Correct allOf with only one child schema (no discriminator) (OpenAPITools#6901)
  [Go]: Interface definitions for api functions (OpenAPITools#5914)
  Update bug_report.md (OpenAPITools#7320)
  update samples
  [Java][Client] Use java8 OffsetDateTime for clients (OpenAPITools#7190)
  [java] Intro openApiNullable property to enable/disable OpenAPI Jackson Nullable library (OpenAPITools#6154)
  [Spring Boot] update dependencies, mark java8 option as deprecated (OpenAPITools#7306)
  Remove dot in golang type (OpenAPITools#7307)
  [doc] Document usage of post-process file feature (OpenAPITools#7315)
  fix http bear auth documentation for go clinets (OpenAPITools#7312)
  [Extensions][Go][Java] Test x-auth-id-alias (OpenAPITools#6642)
  [php-slim4] Move config to a separate file (OpenAPITools#6971)
  [C][Client][Clang Static Analyzer] Remove the useless free operation for (OpenAPITools#7309)
  Fix typescript-node generation when only models are generated (OpenAPITools#7127)
  update spring config to use java8 (OpenAPITools#7308)
  [C][Client][Clang Static Analyzer] Fix uninitialized argument value (OpenAPITools#7305)
  [Java] remove deprecated jackson classes (OpenAPITools#7304)
  ...
@wing328 wing328 deleted the fix-allof-single branch September 2, 2020 07:49
@wing328 wing328 restored the fix-allof-single branch September 2, 2020 07:49
@typhoon2k
Copy link
Contributor

hi @wing328 , @jimschubert , is there any chance this update will get into master sometime soon?

@wing328 wing328 deleted the fix-allof-single branch November 3, 2020 14:26
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

6 participants