Skip to content

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

Merged
jimschubert merged 5 commits into
masterfrom
fix-allof-single
Sep 1, 2020
Merged

Correct allOf with only one child schema (no discriminator)#6901
jimschubert merged 5 commits into
masterfrom
fix-allof-single

Conversation

@wing328

@wing328wing328 commented Jul 9, 2020

Copy link
Copy Markdown
Member

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
Copy Markdown

How to do enable inheritance without discriminator?

@wing328

Copy link
Copy Markdown
MemberAuthor

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

composedSchema.getName(), composedSchema.getTitle());
}
} else {
// not a ref, doing nothing, except counting the number of times the 'null' type

Copy link
Copy Markdown

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

@spacetherspacether left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Looks good

// not a parent since discriminator.propertyName is not set
hasAmbiguousParents = true;
refedWithoutDiscriminator.add(parentName);
// TOOD to be removed in 6.x release

Copy link
Copy Markdown

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
Copy Markdown
MemberAuthor

@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

typhoon2k commented Aug 10, 2020

Copy link
Copy Markdown
Contributor

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: BaseSchematype: objectdescription: Base schema descriptionproperties:
property1:
type: stringproperty2:
type: string

extension_schemas.yaml:

extensionSchematitle: ExtensionSchematype: objectdescription: Extension schema descriptionallOf:
- $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

typhoon2k commented Aug 10, 2020

Copy link
Copy Markdown
Contributor

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
Copy Markdown
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
Copy Markdown
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

@jimschubertjimschubert left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

LGTM

@typhoon2k

typhoon2k commented Aug 31, 2020

Copy link
Copy Markdown
Contributor

@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
Copy Markdown
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 masterSep 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

Copy link
Copy Markdown
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
Copy Markdown
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 freeto 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

@wing328@m-mohr@typhoon2k@jimschubert@spacether@jeff9finger
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Correct allOf with only one child schema (no discriminator) by wing328 · Pull Request #6901 · OpenAPITools/openapi-generator · GitHub
Skip to content

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

Merged
jimschubert merged 5 commits into
masterfrom
fix-allof-single
Sep 1, 2020
Merged

Correct allOf with only one child schema (no discriminator)#6901
jimschubert merged 5 commits into
masterfrom
fix-allof-single

Conversation

@wing328

@wing328wing328 commented Jul 9, 2020

Copy link
Copy Markdown
Member

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
Copy Markdown

How to do enable inheritance without discriminator?

@wing328

Copy link
Copy Markdown
MemberAuthor

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

composedSchema.getName(), composedSchema.getTitle());
}
} else {
// not a ref, doing nothing, except counting the number of times the 'null' type

Copy link
Copy Markdown

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

@spacetherspacether left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Looks good

// not a parent since discriminator.propertyName is not set
hasAmbiguousParents = true;
refedWithoutDiscriminator.add(parentName);
// TOOD to be removed in 6.x release

Copy link
Copy Markdown

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
Copy Markdown
MemberAuthor

@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

typhoon2k commented Aug 10, 2020

Copy link
Copy Markdown
Contributor

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: BaseSchematype: objectdescription: Base schema descriptionproperties:
property1:
type: stringproperty2:
type: string

extension_schemas.yaml:

extensionSchematitle: ExtensionSchematype: objectdescription: Extension schema descriptionallOf:
- $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

typhoon2k commented Aug 10, 2020

Copy link
Copy Markdown
Contributor

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
Copy Markdown
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
Copy Markdown
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

@jimschubertjimschubert left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

LGTM

@typhoon2k

typhoon2k commented Aug 31, 2020

Copy link
Copy Markdown
Contributor

@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
Copy Markdown
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 masterSep 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

Copy link
Copy Markdown
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
Copy Markdown
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 freeto 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

@wing328@m-mohr@typhoon2k@jimschubert@spacether@jeff9finger
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Correct allOf with only one child schema (no discriminator) by wing328 · Pull Request #6901 · OpenAPITools/openapi-generator · GitHub
Skip to content

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

Merged
jimschubert merged 5 commits into
masterfrom
fix-allof-single
Sep 1, 2020
Merged

Correct allOf with only one child schema (no discriminator)#6901
jimschubert merged 5 commits into
masterfrom
fix-allof-single

Conversation

@wing328

@wing328wing328 commented Jul 9, 2020

Copy link
Copy Markdown
Member

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
Copy Markdown

How to do enable inheritance without discriminator?

@wing328

Copy link
Copy Markdown
MemberAuthor

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

composedSchema.getName(), composedSchema.getTitle());
}
} else {
// not a ref, doing nothing, except counting the number of times the 'null' type

Copy link
Copy Markdown

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

@spacetherspacether left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Looks good

// not a parent since discriminator.propertyName is not set
hasAmbiguousParents = true;
refedWithoutDiscriminator.add(parentName);
// TOOD to be removed in 6.x release

Copy link
Copy Markdown

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
Copy Markdown
MemberAuthor

@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

typhoon2k commented Aug 10, 2020

Copy link
Copy Markdown
Contributor

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: BaseSchematype: objectdescription: Base schema descriptionproperties:
property1:
type: stringproperty2:
type: string

extension_schemas.yaml:

extensionSchematitle: ExtensionSchematype: objectdescription: Extension schema descriptionallOf:
- $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

typhoon2k commented Aug 10, 2020

Copy link
Copy Markdown
Contributor

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
Copy Markdown
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
Copy Markdown
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

@jimschubertjimschubert left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

LGTM

@typhoon2k

typhoon2k commented Aug 31, 2020

Copy link
Copy Markdown
Contributor

@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
Copy Markdown
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 masterSep 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

Copy link
Copy Markdown
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
Copy Markdown
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 freeto 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

@wing328@m-mohr@typhoon2k@jimschubert@spacether@jeff9finger
, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Correct allOf with only one child schema (no discriminator) by wing328 · Pull Request #6901 · OpenAPITools/openapi-generator · GitHub
Skip to content

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

Merged
jimschubert merged 5 commits into
masterfrom
fix-allof-single
Sep 1, 2020
Merged

Correct allOf with only one child schema (no discriminator)#6901
jimschubert merged 5 commits into
masterfrom
fix-allof-single

Conversation

@wing328

@wing328wing328 commented Jul 9, 2020

Copy link
Copy Markdown
Member

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
Copy Markdown

How to do enable inheritance without discriminator?

@wing328

Copy link
Copy Markdown
MemberAuthor

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

composedSchema.getName(), composedSchema.getTitle());
}
} else {
// not a ref, doing nothing, except counting the number of times the 'null' type

Copy link
Copy Markdown

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

@spacetherspacether left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Looks good

// not a parent since discriminator.propertyName is not set
hasAmbiguousParents = true;
refedWithoutDiscriminator.add(parentName);
// TOOD to be removed in 6.x release

Copy link
Copy Markdown

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
Copy Markdown
MemberAuthor

@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

typhoon2k commented Aug 10, 2020

Copy link
Copy Markdown
Contributor

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: BaseSchematype: objectdescription: Base schema descriptionproperties:
property1:
type: stringproperty2:
type: string

extension_schemas.yaml:

extensionSchematitle: ExtensionSchematype: objectdescription: Extension schema descriptionallOf:
- $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

typhoon2k commented Aug 10, 2020

Copy link
Copy Markdown
Contributor

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
Copy Markdown
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
Copy Markdown
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

@jimschubertjimschubert left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

LGTM

@typhoon2k

typhoon2k commented Aug 31, 2020

Copy link
Copy Markdown
Contributor

@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
Copy Markdown
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 masterSep 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

Copy link
Copy Markdown
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
Copy Markdown
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 freeto 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

@wing328@m-mohr@typhoon2k@jimschubert@spacether@jeff9finger
, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' Correct allOf with only one child schema (no discriminator) by wing328 · Pull Request #6901 · OpenAPITools/openapi-generator · GitHub
Skip to content

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

Merged
jimschubert merged 5 commits into
masterfrom
fix-allof-single
Sep 1, 2020
Merged

Correct allOf with only one child schema (no discriminator)#6901
jimschubert merged 5 commits into
masterfrom
fix-allof-single

Conversation

@wing328

@wing328wing328 commented Jul 9, 2020

Copy link
Copy Markdown
Member

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
Copy Markdown

How to do enable inheritance without discriminator?

@wing328

Copy link
Copy Markdown
MemberAuthor

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

composedSchema.getName(), composedSchema.getTitle());
}
} else {
// not a ref, doing nothing, except counting the number of times the 'null' type

Copy link
Copy Markdown

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

@spacetherspacether left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Looks good

// not a parent since discriminator.propertyName is not set
hasAmbiguousParents = true;
refedWithoutDiscriminator.add(parentName);
// TOOD to be removed in 6.x release

Copy link
Copy Markdown

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
Copy Markdown
MemberAuthor

@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

typhoon2k commented Aug 10, 2020

Copy link
Copy Markdown
Contributor

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: BaseSchematype: objectdescription: Base schema descriptionproperties:
property1:
type: stringproperty2:
type: string

extension_schemas.yaml:

extensionSchematitle: ExtensionSchematype: objectdescription: Extension schema descriptionallOf:
- $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

typhoon2k commented Aug 10, 2020

Copy link
Copy Markdown
Contributor

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
Copy Markdown
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
Copy Markdown
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

@jimschubertjimschubert left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

LGTM

@typhoon2k

typhoon2k commented Aug 31, 2020

Copy link
Copy Markdown
Contributor

@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
Copy Markdown
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 masterSep 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

Copy link
Copy Markdown
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
Copy Markdown
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 freeto 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

@wing328@m-mohr@typhoon2k@jimschubert@spacether@jeff9finger
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Correct allOf with only one child schema (no discriminator) by wing328 · Pull Request #6901 · OpenAPITools/openapi-generator · GitHub
Skip to content

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

Merged
jimschubert merged 5 commits into
masterfrom
fix-allof-single
Sep 1, 2020
Merged

Correct allOf with only one child schema (no discriminator)#6901
jimschubert merged 5 commits into
masterfrom
fix-allof-single

Conversation

@wing328

@wing328wing328 commented Jul 9, 2020

Copy link
Copy Markdown
Member

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
Copy Markdown

How to do enable inheritance without discriminator?

@wing328

Copy link
Copy Markdown
MemberAuthor

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

composedSchema.getName(), composedSchema.getTitle());
}
} else {
// not a ref, doing nothing, except counting the number of times the 'null' type

Copy link
Copy Markdown

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

@spacetherspacether left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Looks good

// not a parent since discriminator.propertyName is not set
hasAmbiguousParents = true;
refedWithoutDiscriminator.add(parentName);
// TOOD to be removed in 6.x release

Copy link
Copy Markdown

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
Copy Markdown
MemberAuthor

@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

typhoon2k commented Aug 10, 2020

Copy link
Copy Markdown
Contributor

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: BaseSchematype: objectdescription: Base schema descriptionproperties:
property1:
type: stringproperty2:
type: string

extension_schemas.yaml:

extensionSchematitle: ExtensionSchematype: objectdescription: Extension schema descriptionallOf:
- $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

typhoon2k commented Aug 10, 2020

Copy link
Copy Markdown
Contributor

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
Copy Markdown
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
Copy Markdown
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

@jimschubertjimschubert left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

LGTM

@typhoon2k

typhoon2k commented Aug 31, 2020

Copy link
Copy Markdown
Contributor

@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
Copy Markdown
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 masterSep 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

Copy link
Copy Markdown
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
Copy Markdown
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 freeto 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

@wing328@m-mohr@typhoon2k@jimschubert@spacether@jeff9finger
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Correct allOf with only one child schema (no discriminator) by wing328 · Pull Request #6901 · OpenAPITools/openapi-generator · GitHub
Skip to content

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

Merged
jimschubert merged 5 commits into
masterfrom
fix-allof-single
Sep 1, 2020
Merged

Correct allOf with only one child schema (no discriminator)#6901
jimschubert merged 5 commits into
masterfrom
fix-allof-single

Conversation

@wing328

@wing328wing328 commented Jul 9, 2020

Copy link
Copy Markdown
Member

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
Copy Markdown

How to do enable inheritance without discriminator?

@wing328

Copy link
Copy Markdown
MemberAuthor

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

composedSchema.getName(), composedSchema.getTitle());
}
} else {
// not a ref, doing nothing, except counting the number of times the 'null' type

Copy link
Copy Markdown

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

@spacetherspacether left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Looks good

// not a parent since discriminator.propertyName is not set
hasAmbiguousParents = true;
refedWithoutDiscriminator.add(parentName);
// TOOD to be removed in 6.x release

Copy link
Copy Markdown

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
Copy Markdown
MemberAuthor

@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

typhoon2k commented Aug 10, 2020

Copy link
Copy Markdown
Contributor

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: BaseSchematype: objectdescription: Base schema descriptionproperties:
property1:
type: stringproperty2:
type: string

extension_schemas.yaml:

extensionSchematitle: ExtensionSchematype: objectdescription: Extension schema descriptionallOf:
- $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

typhoon2k commented Aug 10, 2020

Copy link
Copy Markdown
Contributor

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
Copy Markdown
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
Copy Markdown
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

@jimschubertjimschubert left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

LGTM

@typhoon2k

typhoon2k commented Aug 31, 2020

Copy link
Copy Markdown
Contributor

@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
Copy Markdown
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 masterSep 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

Copy link
Copy Markdown
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
Copy Markdown
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 freeto 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

@wing328@m-mohr@typhoon2k@jimschubert@spacether@jeff9finger
, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); Correct allOf with only one child schema (no discriminator) by wing328 · Pull Request #6901 · OpenAPITools/openapi-generator · GitHub
Skip to content

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

Merged
jimschubert merged 5 commits into
masterfrom
fix-allof-single
Sep 1, 2020
Merged

Correct allOf with only one child schema (no discriminator)#6901
jimschubert merged 5 commits into
masterfrom
fix-allof-single

Conversation

@wing328

@wing328wing328 commented Jul 9, 2020

Copy link
Copy Markdown
Member

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
Copy Markdown

How to do enable inheritance without discriminator?

@wing328

Copy link
Copy Markdown
MemberAuthor

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

composedSchema.getName(), composedSchema.getTitle());
}
} else {
// not a ref, doing nothing, except counting the number of times the 'null' type

Copy link
Copy Markdown

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

@spacetherspacether left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Looks good

// not a parent since discriminator.propertyName is not set
hasAmbiguousParents = true;
refedWithoutDiscriminator.add(parentName);
// TOOD to be removed in 6.x release

Copy link
Copy Markdown

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
Copy Markdown
MemberAuthor

@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

typhoon2k commented Aug 10, 2020

Copy link
Copy Markdown
Contributor

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: BaseSchematype: objectdescription: Base schema descriptionproperties:
property1:
type: stringproperty2:
type: string

extension_schemas.yaml:

extensionSchematitle: ExtensionSchematype: objectdescription: Extension schema descriptionallOf:
- $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

typhoon2k commented Aug 10, 2020

Copy link
Copy Markdown
Contributor

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
Copy Markdown
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
Copy Markdown
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

@jimschubertjimschubert left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

LGTM

@typhoon2k

typhoon2k commented Aug 31, 2020

Copy link
Copy Markdown
Contributor

@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
Copy Markdown
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 masterSep 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

Copy link
Copy Markdown
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
Copy Markdown
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 freeto 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

@wing328@m-mohr@typhoon2k@jimschubert@spacether@jeff9finger