[Java/Core] Adds properties to ComposedSchema models when they exist - #4482

Merged
jimschubert merged 2 commits into
OpenAPITools:masterfrom
spacether:fixes_oneof_class
Dec 4, 2019
Merged

[Java/Core] Adds properties to ComposedSchema models when they exist#4482
jimschubert merged 2 commits into
OpenAPITools:masterfrom
spacether:fixes_oneof_class

Conversation

@spacether

@spacetherspacether commented Nov 13, 2019

Copy link
Copy Markdown
Contributor

This PR fixes this issue:
#4515

Currently, when we process composedSchemas, we are not including any properties that are described in the properties section of that model's schema. An example is the below fruit model, which leaves out the color property when we ingest it and make a model.

openapi: 3.0.1
info:
title: fruity
version: 0.0.1
paths:
/:
get:
responses:
'200':
description: desc
content:
application/json:
schema:
$ref: '#/components/schemas/fruit'
components:
schemas:
fruit:
title: fruit
properties:
color:
type: string
oneOf:
- $ref: '#/components/schemas/apple'
- $ref: '#/components/schemas/banana'
resolved
apple:
title: apple
type: object
properties:
kind:
type: string
banana:
title: banana
type: object
properties:
count:
type: number

This spec passes validation at: https://apitools.dev/swagger-parser/online/#

This PR fixes this issue, adding properties to the composed model.
We also add a test in DefaultCodegenTest.java where we check that the fruit model contains the color property.

This issue was also recently noticed and fixed in swagger-codegen at: swagger-api/swagger-codegen#9827

Note: additional properties should also be allowed in composed schemas, but that feature is blocked by an upstream bug in swagger-parser. I've included a commented out additionalproperties property in the fruit spec, commented out code to process it in DefaultCodegen.java. Data in both locations links to the open swagger-parser issue which I created at: swagger-api/swagger-parser#1252

  • Read the contribution guidelines.
  • If contributing template-only or documentation-only changes which will change sample output, build the project before.
  • Run the shell script(s) under ./bin/ (or Windows batch scripts under.\bin\windows) to update Petstore samples related to your fix. This is important, as CI jobs will verify all generator outputs of your HEAD commit, and these must match the expectations made by your contribution. You only need to run ./bin/{LANG}-petstore.sh, ./bin/openapi3/{LANG}-petstore.sh if updating the code or mustache templates for a language ({LANG}) (e.g. php, ruby, python, etc).
  • File the PR against the correct branch: master, 4.3.x, 5.0.x. Default: master.
  • Copy the technical committee to review the pull request if your PR is targeting a particular programming language.

Java Technical Committee
@bbdouglas (2017/07) @sreeshas (2017/08) @jfiala (2017/08) @lukoyanov (2017/09) @cbornet (2017/09) @jeff9finger (2018/01) @karismann (2019/03) @Zomzog (2019/04) @lwlee2608 (2019/10)

Core Team
@wing328 (2015/07) ❤️
@jimschubert (2016/05) ❤️
@cbornet (2016/05)
@ackintosh (2018/02) ❤️
@jmini (2018/04) ❤️
@etherealjoy (2019/06)

@spacetherspacether changed the title Adds properties to ComposedSchema models when they exist[Java] Adds properties to ComposedSchema models when they existNov 13, 2019
@spacetherspacether mentioned this pull request Nov 17, 2019
5 tasks

@lwlee2608lwlee2608 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 to me. It is is identical with my PR #4516 . I shall cancel my PR since this is done earlier.

I believe you should cc the core member instead of java technical committee.

@spacetherspacether changed the title [Java] Adds properties to ComposedSchema models when they exist[Java/Core] Adds properties to ComposedSchema models when they existNov 18, 2019
@spacether

Copy link
Copy Markdown
ContributorAuthor

Looks good to me. It is is identical with my PR #4515. I shall cancel my PR since this is done earlier.

I believe you should cc the core member instead of java technical committee.

Ah, didn't know that. I just cced them, thanks!

@lwlee2608lwlee2608 mentioned this pull request Nov 18, 2019
5 tasks
@spacether

spacether commented Nov 22, 2019

Copy link
Copy Markdown
ContributorAuthor

Core Team: @wing328@jimschubert@cbornet@ackintosh@jmini@etherealjoy
Gentle reminder that this still needs a review

@jeff9fingerjeff9finger left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

LGTM 👍

@spacether

Copy link
Copy Markdown
ContributorAuthor

@wing328 these changes were approved 8 days ago. Is there a milestone that they can be added to? Is any more work required in the PR?

@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.

Awesome.

Comment on lines +25 to +27
# additionalProperties:
# type: string
# uncomment this when https://github.com/swagger-api/swagger-parser/issues/1252 is resolved

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.

I wouldn't imagine this will get fixed anytime soon in swagger-parser for the 3.0 specification (the revision versions 3.0.1/3.0.2 are supposedly documentation-only changes).

The behavior you're seeing where this returns MapSchema is defined behavior: https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#model-with-mapdictionary-properties

The requested behavior is undefined, as there's not enough clarity in the specification around constraints of using oneOf. It should be that oneOf can only coexist with discriminator.

oneOf is taken from JSON Schema's specification Section 9.2.1.3, which says:

This keyword's value MUST be a non-empty array. Each item of the array MUST be a valid JSON Schema.

An instance validates successfully against this keyword if it validates successfully against exactly one schema defined by this keyword's value.

Meaning your example is only a valid object if it is exactly apple or exactly banana, and no dynamic properties via additionalProperties are allowed due to the use of MUST rather than SHOULD in the JSON Schema specification.

The discriminator support for oneOf is a JSON Schema extension defined in the OAS Composition and Inheritance (Polymorphism) section.

Ideally, a spec with oneOf any anything besides discriminator should fail validation. We could consider adding this strict validation to OpenAPI Generator, or at least as a recommendation via the --recommend flag to the validate command.

addVars(m, unaliasPropertySchema(schema.getProperties()), schema.getRequired(), null, null);
}

// uncomment this when https://github.com/swagger-api/swagger-parser/issues/1252 is resolved

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.

See my comment on the example spec document in this PR.


// if schema has properties outside of allOf/oneOf/anyOf also add them to m
if (schema.getProperties() != null) {
addVars(m, unaliasPropertySchema(schema.getProperties()), schema.getRequired(), null, null);

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.

@wing328 See my other comment in this PR. Constraints around structures containing oneOf aren't very clearly defined in OAS 3.x, since the extension to include discriminator makes it look like any Schema properties are valid.

Do you think we should log a warning here, or wrap it the a ! strict spec check, or both? I've commented elsewhere as well that we might want to add to the validate and/or recommends about this.

@jimschubert

Copy link
Copy Markdown
Member

This spec passes validation at: https://apitools.dev/swagger-parser/online/#

Just a heads up that our CLI also validates:

openapi-generator validate -i openapi.yml

@jimschubert
jimschubert merged commit c882338 into OpenAPITools:masterDec 4, 2019
@spacether
spacether deleted the fixes_oneof_class branch December 4, 2019 03:01
@spacether
spacether restored the fixes_oneof_class branch February 3, 2020 17:48
@spacether
spacether deleted the fixes_oneof_class branch April 30, 2020 03:49
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.

4 participants

@spacether@jimschubert@lwlee2608@jeff9finger
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n 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;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

[Java/Core] Adds properties to ComposedSchema models when they exist - #4482

Merged
jimschubert merged 2 commits into
OpenAPITools:masterfrom
spacether:fixes_oneof_class
Dec 4, 2019
Merged

[Java/Core] Adds properties to ComposedSchema models when they exist#4482
jimschubert merged 2 commits into
OpenAPITools:masterfrom
spacether:fixes_oneof_class

Conversation

@spacether

@spacetherspacether commented Nov 13, 2019

Copy link
Copy Markdown
Contributor

This PR fixes this issue:
#4515

Currently, when we process composedSchemas, we are not including any properties that are described in the properties section of that model's schema. An example is the below fruit model, which leaves out the color property when we ingest it and make a model.

openapi: 3.0.1
info:
title: fruity
version: 0.0.1
paths:
/:
get:
responses:
'200':
description: desc
content:
application/json:
schema:
$ref: '#/components/schemas/fruit'
components:
schemas:
fruit:
title: fruit
properties:
color:
type: string
oneOf:
- $ref: '#/components/schemas/apple'
- $ref: '#/components/schemas/banana'
resolved
apple:
title: apple
type: object
properties:
kind:
type: string
banana:
title: banana
type: object
properties:
count:
type: number

This spec passes validation at: https://apitools.dev/swagger-parser/online/#

This PR fixes this issue, adding properties to the composed model.
We also add a test in DefaultCodegenTest.java where we check that the fruit model contains the color property.

This issue was also recently noticed and fixed in swagger-codegen at: swagger-api/swagger-codegen#9827

Note: additional properties should also be allowed in composed schemas, but that feature is blocked by an upstream bug in swagger-parser. I've included a commented out additionalproperties property in the fruit spec, commented out code to process it in DefaultCodegen.java. Data in both locations links to the open swagger-parser issue which I created at: swagger-api/swagger-parser#1252

  • Read the contribution guidelines.
  • If contributing template-only or documentation-only changes which will change sample output, build the project before.
  • Run the shell script(s) under ./bin/ (or Windows batch scripts under.\bin\windows) to update Petstore samples related to your fix. This is important, as CI jobs will verify all generator outputs of your HEAD commit, and these must match the expectations made by your contribution. You only need to run ./bin/{LANG}-petstore.sh, ./bin/openapi3/{LANG}-petstore.sh if updating the code or mustache templates for a language ({LANG}) (e.g. php, ruby, python, etc).
  • File the PR against the correct branch: master, 4.3.x, 5.0.x. Default: master.
  • Copy the technical committee to review the pull request if your PR is targeting a particular programming language.

Java Technical Committee
@bbdouglas (2017/07) @sreeshas (2017/08) @jfiala (2017/08) @lukoyanov (2017/09) @cbornet (2017/09) @jeff9finger (2018/01) @karismann (2019/03) @Zomzog (2019/04) @lwlee2608 (2019/10)

Core Team
@wing328 (2015/07) ❤️
@jimschubert (2016/05) ❤️
@cbornet (2016/05)
@ackintosh (2018/02) ❤️
@jmini (2018/04) ❤️
@etherealjoy (2019/06)

@spacetherspacether changed the title Adds properties to ComposedSchema models when they exist[Java] Adds properties to ComposedSchema models when they existNov 13, 2019
@spacetherspacether mentioned this pull request Nov 17, 2019
5 tasks

@lwlee2608lwlee2608 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 to me. It is is identical with my PR #4516 . I shall cancel my PR since this is done earlier.

I believe you should cc the core member instead of java technical committee.

@spacetherspacether changed the title [Java] Adds properties to ComposedSchema models when they exist[Java/Core] Adds properties to ComposedSchema models when they existNov 18, 2019
@spacether

Copy link
Copy Markdown
ContributorAuthor

Looks good to me. It is is identical with my PR #4515. I shall cancel my PR since this is done earlier.

I believe you should cc the core member instead of java technical committee.

Ah, didn't know that. I just cced them, thanks!

@lwlee2608lwlee2608 mentioned this pull request Nov 18, 2019
5 tasks
@spacether

spacether commented Nov 22, 2019

Copy link
Copy Markdown
ContributorAuthor

Core Team: @wing328@jimschubert@cbornet@ackintosh@jmini@etherealjoy
Gentle reminder that this still needs a review

@jeff9fingerjeff9finger left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

LGTM 👍

@spacether

Copy link
Copy Markdown
ContributorAuthor

@wing328 these changes were approved 8 days ago. Is there a milestone that they can be added to? Is any more work required in the PR?

@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.

Awesome.

Comment on lines +25 to +27
# additionalProperties:
# type: string
# uncomment this when https://github.com/swagger-api/swagger-parser/issues/1252 is resolved

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.

I wouldn't imagine this will get fixed anytime soon in swagger-parser for the 3.0 specification (the revision versions 3.0.1/3.0.2 are supposedly documentation-only changes).

The behavior you're seeing where this returns MapSchema is defined behavior: https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#model-with-mapdictionary-properties

The requested behavior is undefined, as there's not enough clarity in the specification around constraints of using oneOf. It should be that oneOf can only coexist with discriminator.

oneOf is taken from JSON Schema's specification Section 9.2.1.3, which says:

This keyword's value MUST be a non-empty array. Each item of the array MUST be a valid JSON Schema.

An instance validates successfully against this keyword if it validates successfully against exactly one schema defined by this keyword's value.

Meaning your example is only a valid object if it is exactly apple or exactly banana, and no dynamic properties via additionalProperties are allowed due to the use of MUST rather than SHOULD in the JSON Schema specification.

The discriminator support for oneOf is a JSON Schema extension defined in the OAS Composition and Inheritance (Polymorphism) section.

Ideally, a spec with oneOf any anything besides discriminator should fail validation. We could consider adding this strict validation to OpenAPI Generator, or at least as a recommendation via the --recommend flag to the validate command.

addVars(m, unaliasPropertySchema(schema.getProperties()), schema.getRequired(), null, null);
}

// uncomment this when https://github.com/swagger-api/swagger-parser/issues/1252 is resolved

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.

See my comment on the example spec document in this PR.


// if schema has properties outside of allOf/oneOf/anyOf also add them to m
if (schema.getProperties() != null) {
addVars(m, unaliasPropertySchema(schema.getProperties()), schema.getRequired(), null, null);

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.

@wing328 See my other comment in this PR. Constraints around structures containing oneOf aren't very clearly defined in OAS 3.x, since the extension to include discriminator makes it look like any Schema properties are valid.

Do you think we should log a warning here, or wrap it the a ! strict spec check, or both? I've commented elsewhere as well that we might want to add to the validate and/or recommends about this.

@jimschubert

Copy link
Copy Markdown
Member

This spec passes validation at: https://apitools.dev/swagger-parser/online/#

Just a heads up that our CLI also validates:

openapi-generator validate -i openapi.yml

@jimschubert
jimschubert merged commit c882338 into OpenAPITools:masterDec 4, 2019
@spacether
spacether deleted the fixes_oneof_class branch December 4, 2019 03:01
@spacether
spacether restored the fixes_oneof_class branch February 3, 2020 17:48
@spacether
spacether deleted the fixes_oneof_class branch April 30, 2020 03:49
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.

4 participants

@spacether@jimschubert@lwlee2608@jeff9finger
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

[Java/Core] Adds properties to ComposedSchema models when they exist - #4482

Merged
jimschubert merged 2 commits into
OpenAPITools:masterfrom
spacether:fixes_oneof_class
Dec 4, 2019
Merged

[Java/Core] Adds properties to ComposedSchema models when they exist#4482
jimschubert merged 2 commits into
OpenAPITools:masterfrom
spacether:fixes_oneof_class

Conversation

@spacether

@spacetherspacether commented Nov 13, 2019

Copy link
Copy Markdown
Contributor

This PR fixes this issue:
#4515

Currently, when we process composedSchemas, we are not including any properties that are described in the properties section of that model's schema. An example is the below fruit model, which leaves out the color property when we ingest it and make a model.

openapi: 3.0.1
info:
title: fruity
version: 0.0.1
paths:
/:
get:
responses:
'200':
description: desc
content:
application/json:
schema:
$ref: '#/components/schemas/fruit'
components:
schemas:
fruit:
title: fruit
properties:
color:
type: string
oneOf:
- $ref: '#/components/schemas/apple'
- $ref: '#/components/schemas/banana'
resolved
apple:
title: apple
type: object
properties:
kind:
type: string
banana:
title: banana
type: object
properties:
count:
type: number

This spec passes validation at: https://apitools.dev/swagger-parser/online/#

This PR fixes this issue, adding properties to the composed model.
We also add a test in DefaultCodegenTest.java where we check that the fruit model contains the color property.

This issue was also recently noticed and fixed in swagger-codegen at: swagger-api/swagger-codegen#9827

Note: additional properties should also be allowed in composed schemas, but that feature is blocked by an upstream bug in swagger-parser. I've included a commented out additionalproperties property in the fruit spec, commented out code to process it in DefaultCodegen.java. Data in both locations links to the open swagger-parser issue which I created at: swagger-api/swagger-parser#1252

  • Read the contribution guidelines.
  • If contributing template-only or documentation-only changes which will change sample output, build the project before.
  • Run the shell script(s) under ./bin/ (or Windows batch scripts under.\bin\windows) to update Petstore samples related to your fix. This is important, as CI jobs will verify all generator outputs of your HEAD commit, and these must match the expectations made by your contribution. You only need to run ./bin/{LANG}-petstore.sh, ./bin/openapi3/{LANG}-petstore.sh if updating the code or mustache templates for a language ({LANG}) (e.g. php, ruby, python, etc).
  • File the PR against the correct branch: master, 4.3.x, 5.0.x. Default: master.
  • Copy the technical committee to review the pull request if your PR is targeting a particular programming language.

Java Technical Committee
@bbdouglas (2017/07) @sreeshas (2017/08) @jfiala (2017/08) @lukoyanov (2017/09) @cbornet (2017/09) @jeff9finger (2018/01) @karismann (2019/03) @Zomzog (2019/04) @lwlee2608 (2019/10)

Core Team
@wing328 (2015/07) ❤️
@jimschubert (2016/05) ❤️
@cbornet (2016/05)
@ackintosh (2018/02) ❤️
@jmini (2018/04) ❤️
@etherealjoy (2019/06)

@spacetherspacether changed the title Adds properties to ComposedSchema models when they exist[Java] Adds properties to ComposedSchema models when they existNov 13, 2019
@spacetherspacether mentioned this pull request Nov 17, 2019
5 tasks

@lwlee2608lwlee2608 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 to me. It is is identical with my PR #4516 . I shall cancel my PR since this is done earlier.

I believe you should cc the core member instead of java technical committee.

@spacetherspacether changed the title [Java] Adds properties to ComposedSchema models when they exist[Java/Core] Adds properties to ComposedSchema models when they existNov 18, 2019
@spacether

Copy link
Copy Markdown
ContributorAuthor

Looks good to me. It is is identical with my PR #4515. I shall cancel my PR since this is done earlier.

I believe you should cc the core member instead of java technical committee.

Ah, didn't know that. I just cced them, thanks!

@lwlee2608lwlee2608 mentioned this pull request Nov 18, 2019
5 tasks
@spacether

spacether commented Nov 22, 2019

Copy link
Copy Markdown
ContributorAuthor

Core Team: @wing328@jimschubert@cbornet@ackintosh@jmini@etherealjoy
Gentle reminder that this still needs a review

@jeff9fingerjeff9finger left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

LGTM 👍

@spacether

Copy link
Copy Markdown
ContributorAuthor

@wing328 these changes were approved 8 days ago. Is there a milestone that they can be added to? Is any more work required in the PR?

@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.

Awesome.

Comment on lines +25 to +27
# additionalProperties:
# type: string
# uncomment this when https://github.com/swagger-api/swagger-parser/issues/1252 is resolved

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.

I wouldn't imagine this will get fixed anytime soon in swagger-parser for the 3.0 specification (the revision versions 3.0.1/3.0.2 are supposedly documentation-only changes).

The behavior you're seeing where this returns MapSchema is defined behavior: https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#model-with-mapdictionary-properties

The requested behavior is undefined, as there's not enough clarity in the specification around constraints of using oneOf. It should be that oneOf can only coexist with discriminator.

oneOf is taken from JSON Schema's specification Section 9.2.1.3, which says:

This keyword's value MUST be a non-empty array. Each item of the array MUST be a valid JSON Schema.

An instance validates successfully against this keyword if it validates successfully against exactly one schema defined by this keyword's value.

Meaning your example is only a valid object if it is exactly apple or exactly banana, and no dynamic properties via additionalProperties are allowed due to the use of MUST rather than SHOULD in the JSON Schema specification.

The discriminator support for oneOf is a JSON Schema extension defined in the OAS Composition and Inheritance (Polymorphism) section.

Ideally, a spec with oneOf any anything besides discriminator should fail validation. We could consider adding this strict validation to OpenAPI Generator, or at least as a recommendation via the --recommend flag to the validate command.

addVars(m, unaliasPropertySchema(schema.getProperties()), schema.getRequired(), null, null);
}

// uncomment this when https://github.com/swagger-api/swagger-parser/issues/1252 is resolved

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.

See my comment on the example spec document in this PR.


// if schema has properties outside of allOf/oneOf/anyOf also add them to m
if (schema.getProperties() != null) {
addVars(m, unaliasPropertySchema(schema.getProperties()), schema.getRequired(), null, null);

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.

@wing328 See my other comment in this PR. Constraints around structures containing oneOf aren't very clearly defined in OAS 3.x, since the extension to include discriminator makes it look like any Schema properties are valid.

Do you think we should log a warning here, or wrap it the a ! strict spec check, or both? I've commented elsewhere as well that we might want to add to the validate and/or recommends about this.

@jimschubert

Copy link
Copy Markdown
Member

This spec passes validation at: https://apitools.dev/swagger-parser/online/#

Just a heads up that our CLI also validates:

openapi-generator validate -i openapi.yml

@jimschubert
jimschubert merged commit c882338 into OpenAPITools:masterDec 4, 2019
@spacether
spacether deleted the fixes_oneof_class branch December 4, 2019 03:01
@spacether
spacether restored the fixes_oneof_class branch February 3, 2020 17:48
@spacether
spacether deleted the fixes_oneof_class branch April 30, 2020 03:49
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.

4 participants

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

[Java/Core] Adds properties to ComposedSchema models when they exist - #4482

Merged
jimschubert merged 2 commits into
OpenAPITools:masterfrom
spacether:fixes_oneof_class
Dec 4, 2019
Merged

[Java/Core] Adds properties to ComposedSchema models when they exist#4482
jimschubert merged 2 commits into
OpenAPITools:masterfrom
spacether:fixes_oneof_class

Conversation

@spacether

@spacetherspacether commented Nov 13, 2019

Copy link
Copy Markdown
Contributor

This PR fixes this issue:
#4515

Currently, when we process composedSchemas, we are not including any properties that are described in the properties section of that model's schema. An example is the below fruit model, which leaves out the color property when we ingest it and make a model.

openapi: 3.0.1
info:
title: fruity
version: 0.0.1
paths:
/:
get:
responses:
'200':
description: desc
content:
application/json:
schema:
$ref: '#/components/schemas/fruit'
components:
schemas:
fruit:
title: fruit
properties:
color:
type: string
oneOf:
- $ref: '#/components/schemas/apple'
- $ref: '#/components/schemas/banana'
resolved
apple:
title: apple
type: object
properties:
kind:
type: string
banana:
title: banana
type: object
properties:
count:
type: number

This spec passes validation at: https://apitools.dev/swagger-parser/online/#

This PR fixes this issue, adding properties to the composed model.
We also add a test in DefaultCodegenTest.java where we check that the fruit model contains the color property.

This issue was also recently noticed and fixed in swagger-codegen at: swagger-api/swagger-codegen#9827

Note: additional properties should also be allowed in composed schemas, but that feature is blocked by an upstream bug in swagger-parser. I've included a commented out additionalproperties property in the fruit spec, commented out code to process it in DefaultCodegen.java. Data in both locations links to the open swagger-parser issue which I created at: swagger-api/swagger-parser#1252

  • Read the contribution guidelines.
  • If contributing template-only or documentation-only changes which will change sample output, build the project before.
  • Run the shell script(s) under ./bin/ (or Windows batch scripts under.\bin\windows) to update Petstore samples related to your fix. This is important, as CI jobs will verify all generator outputs of your HEAD commit, and these must match the expectations made by your contribution. You only need to run ./bin/{LANG}-petstore.sh, ./bin/openapi3/{LANG}-petstore.sh if updating the code or mustache templates for a language ({LANG}) (e.g. php, ruby, python, etc).
  • File the PR against the correct branch: master, 4.3.x, 5.0.x. Default: master.
  • Copy the technical committee to review the pull request if your PR is targeting a particular programming language.

Java Technical Committee
@bbdouglas (2017/07) @sreeshas (2017/08) @jfiala (2017/08) @lukoyanov (2017/09) @cbornet (2017/09) @jeff9finger (2018/01) @karismann (2019/03) @Zomzog (2019/04) @lwlee2608 (2019/10)

Core Team
@wing328 (2015/07) ❤️
@jimschubert (2016/05) ❤️
@cbornet (2016/05)
@ackintosh (2018/02) ❤️
@jmini (2018/04) ❤️
@etherealjoy (2019/06)

@spacetherspacether changed the title Adds properties to ComposedSchema models when they exist[Java] Adds properties to ComposedSchema models when they existNov 13, 2019
@spacetherspacether mentioned this pull request Nov 17, 2019
5 tasks

@lwlee2608lwlee2608 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 to me. It is is identical with my PR #4516 . I shall cancel my PR since this is done earlier.

I believe you should cc the core member instead of java technical committee.

@spacetherspacether changed the title [Java] Adds properties to ComposedSchema models when they exist[Java/Core] Adds properties to ComposedSchema models when they existNov 18, 2019
@spacether

Copy link
Copy Markdown
ContributorAuthor

Looks good to me. It is is identical with my PR #4515. I shall cancel my PR since this is done earlier.

I believe you should cc the core member instead of java technical committee.

Ah, didn't know that. I just cced them, thanks!

@lwlee2608lwlee2608 mentioned this pull request Nov 18, 2019
5 tasks
@spacether

spacether commented Nov 22, 2019

Copy link
Copy Markdown
ContributorAuthor

Core Team: @wing328@jimschubert@cbornet@ackintosh@jmini@etherealjoy
Gentle reminder that this still needs a review

@jeff9fingerjeff9finger left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

LGTM 👍

@spacether

Copy link
Copy Markdown
ContributorAuthor

@wing328 these changes were approved 8 days ago. Is there a milestone that they can be added to? Is any more work required in the PR?

@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.

Awesome.

Comment on lines +25 to +27
# additionalProperties:
# type: string
# uncomment this when https://github.com/swagger-api/swagger-parser/issues/1252 is resolved

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.

I wouldn't imagine this will get fixed anytime soon in swagger-parser for the 3.0 specification (the revision versions 3.0.1/3.0.2 are supposedly documentation-only changes).

The behavior you're seeing where this returns MapSchema is defined behavior: https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#model-with-mapdictionary-properties

The requested behavior is undefined, as there's not enough clarity in the specification around constraints of using oneOf. It should be that oneOf can only coexist with discriminator.

oneOf is taken from JSON Schema's specification Section 9.2.1.3, which says:

This keyword's value MUST be a non-empty array. Each item of the array MUST be a valid JSON Schema.

An instance validates successfully against this keyword if it validates successfully against exactly one schema defined by this keyword's value.

Meaning your example is only a valid object if it is exactly apple or exactly banana, and no dynamic properties via additionalProperties are allowed due to the use of MUST rather than SHOULD in the JSON Schema specification.

The discriminator support for oneOf is a JSON Schema extension defined in the OAS Composition and Inheritance (Polymorphism) section.

Ideally, a spec with oneOf any anything besides discriminator should fail validation. We could consider adding this strict validation to OpenAPI Generator, or at least as a recommendation via the --recommend flag to the validate command.

addVars(m, unaliasPropertySchema(schema.getProperties()), schema.getRequired(), null, null);
}

// uncomment this when https://github.com/swagger-api/swagger-parser/issues/1252 is resolved

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.

See my comment on the example spec document in this PR.


// if schema has properties outside of allOf/oneOf/anyOf also add them to m
if (schema.getProperties() != null) {
addVars(m, unaliasPropertySchema(schema.getProperties()), schema.getRequired(), null, null);

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.

@wing328 See my other comment in this PR. Constraints around structures containing oneOf aren't very clearly defined in OAS 3.x, since the extension to include discriminator makes it look like any Schema properties are valid.

Do you think we should log a warning here, or wrap it the a ! strict spec check, or both? I've commented elsewhere as well that we might want to add to the validate and/or recommends about this.

@jimschubert

Copy link
Copy Markdown
Member

This spec passes validation at: https://apitools.dev/swagger-parser/online/#

Just a heads up that our CLI also validates:

openapi-generator validate -i openapi.yml

@jimschubert
jimschubert merged commit c882338 into OpenAPITools:masterDec 4, 2019
@spacether
spacether deleted the fixes_oneof_class branch December 4, 2019 03:01
@spacether
spacether restored the fixes_oneof_class branch February 3, 2020 17:48
@spacether
spacether deleted the fixes_oneof_class branch April 30, 2020 03:49
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.

4 participants

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

[Java/Core] Adds properties to ComposedSchema models when they exist - #4482

Merged
jimschubert merged 2 commits into
OpenAPITools:masterfrom
spacether:fixes_oneof_class
Dec 4, 2019
Merged

[Java/Core] Adds properties to ComposedSchema models when they exist#4482
jimschubert merged 2 commits into
OpenAPITools:masterfrom
spacether:fixes_oneof_class

Conversation

@spacether

@spacetherspacether commented Nov 13, 2019

Copy link
Copy Markdown
Contributor

This PR fixes this issue:
#4515

Currently, when we process composedSchemas, we are not including any properties that are described in the properties section of that model's schema. An example is the below fruit model, which leaves out the color property when we ingest it and make a model.

openapi: 3.0.1
info:
title: fruity
version: 0.0.1
paths:
/:
get:
responses:
'200':
description: desc
content:
application/json:
schema:
$ref: '#/components/schemas/fruit'
components:
schemas:
fruit:
title: fruit
properties:
color:
type: string
oneOf:
- $ref: '#/components/schemas/apple'
- $ref: '#/components/schemas/banana'
resolved
apple:
title: apple
type: object
properties:
kind:
type: string
banana:
title: banana
type: object
properties:
count:
type: number

This spec passes validation at: https://apitools.dev/swagger-parser/online/#

This PR fixes this issue, adding properties to the composed model.
We also add a test in DefaultCodegenTest.java where we check that the fruit model contains the color property.

This issue was also recently noticed and fixed in swagger-codegen at: swagger-api/swagger-codegen#9827

Note: additional properties should also be allowed in composed schemas, but that feature is blocked by an upstream bug in swagger-parser. I've included a commented out additionalproperties property in the fruit spec, commented out code to process it in DefaultCodegen.java. Data in both locations links to the open swagger-parser issue which I created at: swagger-api/swagger-parser#1252

  • Read the contribution guidelines.
  • If contributing template-only or documentation-only changes which will change sample output, build the project before.
  • Run the shell script(s) under ./bin/ (or Windows batch scripts under.\bin\windows) to update Petstore samples related to your fix. This is important, as CI jobs will verify all generator outputs of your HEAD commit, and these must match the expectations made by your contribution. You only need to run ./bin/{LANG}-petstore.sh, ./bin/openapi3/{LANG}-petstore.sh if updating the code or mustache templates for a language ({LANG}) (e.g. php, ruby, python, etc).
  • File the PR against the correct branch: master, 4.3.x, 5.0.x. Default: master.
  • Copy the technical committee to review the pull request if your PR is targeting a particular programming language.

Java Technical Committee
@bbdouglas (2017/07) @sreeshas (2017/08) @jfiala (2017/08) @lukoyanov (2017/09) @cbornet (2017/09) @jeff9finger (2018/01) @karismann (2019/03) @Zomzog (2019/04) @lwlee2608 (2019/10)

Core Team
@wing328 (2015/07) ❤️
@jimschubert (2016/05) ❤️
@cbornet (2016/05)
@ackintosh (2018/02) ❤️
@jmini (2018/04) ❤️
@etherealjoy (2019/06)

@spacetherspacether changed the title Adds properties to ComposedSchema models when they exist[Java] Adds properties to ComposedSchema models when they existNov 13, 2019
@spacetherspacether mentioned this pull request Nov 17, 2019
5 tasks

@lwlee2608lwlee2608 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 to me. It is is identical with my PR #4516 . I shall cancel my PR since this is done earlier.

I believe you should cc the core member instead of java technical committee.

@spacetherspacether changed the title [Java] Adds properties to ComposedSchema models when they exist[Java/Core] Adds properties to ComposedSchema models when they existNov 18, 2019
@spacether

Copy link
Copy Markdown
ContributorAuthor

Looks good to me. It is is identical with my PR #4515. I shall cancel my PR since this is done earlier.

I believe you should cc the core member instead of java technical committee.

Ah, didn't know that. I just cced them, thanks!

@lwlee2608lwlee2608 mentioned this pull request Nov 18, 2019
5 tasks
@spacether

spacether commented Nov 22, 2019

Copy link
Copy Markdown
ContributorAuthor

Core Team: @wing328@jimschubert@cbornet@ackintosh@jmini@etherealjoy
Gentle reminder that this still needs a review

@jeff9fingerjeff9finger left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

LGTM 👍

@spacether

Copy link
Copy Markdown
ContributorAuthor

@wing328 these changes were approved 8 days ago. Is there a milestone that they can be added to? Is any more work required in the PR?

@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.

Awesome.

Comment on lines +25 to +27
# additionalProperties:
# type: string
# uncomment this when https://github.com/swagger-api/swagger-parser/issues/1252 is resolved

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.

I wouldn't imagine this will get fixed anytime soon in swagger-parser for the 3.0 specification (the revision versions 3.0.1/3.0.2 are supposedly documentation-only changes).

The behavior you're seeing where this returns MapSchema is defined behavior: https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#model-with-mapdictionary-properties

The requested behavior is undefined, as there's not enough clarity in the specification around constraints of using oneOf. It should be that oneOf can only coexist with discriminator.

oneOf is taken from JSON Schema's specification Section 9.2.1.3, which says:

This keyword's value MUST be a non-empty array. Each item of the array MUST be a valid JSON Schema.

An instance validates successfully against this keyword if it validates successfully against exactly one schema defined by this keyword's value.

Meaning your example is only a valid object if it is exactly apple or exactly banana, and no dynamic properties via additionalProperties are allowed due to the use of MUST rather than SHOULD in the JSON Schema specification.

The discriminator support for oneOf is a JSON Schema extension defined in the OAS Composition and Inheritance (Polymorphism) section.

Ideally, a spec with oneOf any anything besides discriminator should fail validation. We could consider adding this strict validation to OpenAPI Generator, or at least as a recommendation via the --recommend flag to the validate command.

addVars(m, unaliasPropertySchema(schema.getProperties()), schema.getRequired(), null, null);
}

// uncomment this when https://github.com/swagger-api/swagger-parser/issues/1252 is resolved

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.

See my comment on the example spec document in this PR.


// if schema has properties outside of allOf/oneOf/anyOf also add them to m
if (schema.getProperties() != null) {
addVars(m, unaliasPropertySchema(schema.getProperties()), schema.getRequired(), null, null);

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.

@wing328 See my other comment in this PR. Constraints around structures containing oneOf aren't very clearly defined in OAS 3.x, since the extension to include discriminator makes it look like any Schema properties are valid.

Do you think we should log a warning here, or wrap it the a ! strict spec check, or both? I've commented elsewhere as well that we might want to add to the validate and/or recommends about this.

@jimschubert

Copy link
Copy Markdown
Member

This spec passes validation at: https://apitools.dev/swagger-parser/online/#

Just a heads up that our CLI also validates:

openapi-generator validate -i openapi.yml

@jimschubert
jimschubert merged commit c882338 into OpenAPITools:masterDec 4, 2019
@spacether
spacether deleted the fixes_oneof_class branch December 4, 2019 03:01
@spacether
spacether restored the fixes_oneof_class branch February 3, 2020 17:48
@spacether
spacether deleted the fixes_oneof_class branch April 30, 2020 03:49
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.

4 participants

@spacether@jimschubert@lwlee2608@jeff9finger
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

[Java/Core] Adds properties to ComposedSchema models when they exist - #4482

Merged
jimschubert merged 2 commits into
OpenAPITools:masterfrom
spacether:fixes_oneof_class
Dec 4, 2019
Merged

[Java/Core] Adds properties to ComposedSchema models when they exist#4482
jimschubert merged 2 commits into
OpenAPITools:masterfrom
spacether:fixes_oneof_class

Conversation

@spacether

@spacetherspacether commented Nov 13, 2019

Copy link
Copy Markdown
Contributor

This PR fixes this issue:
#4515

Currently, when we process composedSchemas, we are not including any properties that are described in the properties section of that model's schema. An example is the below fruit model, which leaves out the color property when we ingest it and make a model.

openapi: 3.0.1
info:
title: fruity
version: 0.0.1
paths:
/:
get:
responses:
'200':
description: desc
content:
application/json:
schema:
$ref: '#/components/schemas/fruit'
components:
schemas:
fruit:
title: fruit
properties:
color:
type: string
oneOf:
- $ref: '#/components/schemas/apple'
- $ref: '#/components/schemas/banana'
resolved
apple:
title: apple
type: object
properties:
kind:
type: string
banana:
title: banana
type: object
properties:
count:
type: number

This spec passes validation at: https://apitools.dev/swagger-parser/online/#

This PR fixes this issue, adding properties to the composed model.
We also add a test in DefaultCodegenTest.java where we check that the fruit model contains the color property.

This issue was also recently noticed and fixed in swagger-codegen at: swagger-api/swagger-codegen#9827

Note: additional properties should also be allowed in composed schemas, but that feature is blocked by an upstream bug in swagger-parser. I've included a commented out additionalproperties property in the fruit spec, commented out code to process it in DefaultCodegen.java. Data in both locations links to the open swagger-parser issue which I created at: swagger-api/swagger-parser#1252

  • Read the contribution guidelines.
  • If contributing template-only or documentation-only changes which will change sample output, build the project before.
  • Run the shell script(s) under ./bin/ (or Windows batch scripts under.\bin\windows) to update Petstore samples related to your fix. This is important, as CI jobs will verify all generator outputs of your HEAD commit, and these must match the expectations made by your contribution. You only need to run ./bin/{LANG}-petstore.sh, ./bin/openapi3/{LANG}-petstore.sh if updating the code or mustache templates for a language ({LANG}) (e.g. php, ruby, python, etc).
  • File the PR against the correct branch: master, 4.3.x, 5.0.x. Default: master.
  • Copy the technical committee to review the pull request if your PR is targeting a particular programming language.

Java Technical Committee
@bbdouglas (2017/07) @sreeshas (2017/08) @jfiala (2017/08) @lukoyanov (2017/09) @cbornet (2017/09) @jeff9finger (2018/01) @karismann (2019/03) @Zomzog (2019/04) @lwlee2608 (2019/10)

Core Team
@wing328 (2015/07) ❤️
@jimschubert (2016/05) ❤️
@cbornet (2016/05)
@ackintosh (2018/02) ❤️
@jmini (2018/04) ❤️
@etherealjoy (2019/06)

@spacetherspacether changed the title Adds properties to ComposedSchema models when they exist[Java] Adds properties to ComposedSchema models when they existNov 13, 2019
@spacetherspacether mentioned this pull request Nov 17, 2019
5 tasks

@lwlee2608lwlee2608 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 to me. It is is identical with my PR #4516 . I shall cancel my PR since this is done earlier.

I believe you should cc the core member instead of java technical committee.

@spacetherspacether changed the title [Java] Adds properties to ComposedSchema models when they exist[Java/Core] Adds properties to ComposedSchema models when they existNov 18, 2019
@spacether

Copy link
Copy Markdown
ContributorAuthor

Looks good to me. It is is identical with my PR #4515. I shall cancel my PR since this is done earlier.

I believe you should cc the core member instead of java technical committee.

Ah, didn't know that. I just cced them, thanks!

@lwlee2608lwlee2608 mentioned this pull request Nov 18, 2019
5 tasks
@spacether

spacether commented Nov 22, 2019

Copy link
Copy Markdown
ContributorAuthor

Core Team: @wing328@jimschubert@cbornet@ackintosh@jmini@etherealjoy
Gentle reminder that this still needs a review

@jeff9fingerjeff9finger left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

LGTM 👍

@spacether

Copy link
Copy Markdown
ContributorAuthor

@wing328 these changes were approved 8 days ago. Is there a milestone that they can be added to? Is any more work required in the PR?

@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.

Awesome.

Comment on lines +25 to +27
# additionalProperties:
# type: string
# uncomment this when https://github.com/swagger-api/swagger-parser/issues/1252 is resolved

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.

I wouldn't imagine this will get fixed anytime soon in swagger-parser for the 3.0 specification (the revision versions 3.0.1/3.0.2 are supposedly documentation-only changes).

The behavior you're seeing where this returns MapSchema is defined behavior: https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#model-with-mapdictionary-properties

The requested behavior is undefined, as there's not enough clarity in the specification around constraints of using oneOf. It should be that oneOf can only coexist with discriminator.

oneOf is taken from JSON Schema's specification Section 9.2.1.3, which says:

This keyword's value MUST be a non-empty array. Each item of the array MUST be a valid JSON Schema.

An instance validates successfully against this keyword if it validates successfully against exactly one schema defined by this keyword's value.

Meaning your example is only a valid object if it is exactly apple or exactly banana, and no dynamic properties via additionalProperties are allowed due to the use of MUST rather than SHOULD in the JSON Schema specification.

The discriminator support for oneOf is a JSON Schema extension defined in the OAS Composition and Inheritance (Polymorphism) section.

Ideally, a spec with oneOf any anything besides discriminator should fail validation. We could consider adding this strict validation to OpenAPI Generator, or at least as a recommendation via the --recommend flag to the validate command.

addVars(m, unaliasPropertySchema(schema.getProperties()), schema.getRequired(), null, null);
}

// uncomment this when https://github.com/swagger-api/swagger-parser/issues/1252 is resolved

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.

See my comment on the example spec document in this PR.


// if schema has properties outside of allOf/oneOf/anyOf also add them to m
if (schema.getProperties() != null) {
addVars(m, unaliasPropertySchema(schema.getProperties()), schema.getRequired(), null, null);

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.

@wing328 See my other comment in this PR. Constraints around structures containing oneOf aren't very clearly defined in OAS 3.x, since the extension to include discriminator makes it look like any Schema properties are valid.

Do you think we should log a warning here, or wrap it the a ! strict spec check, or both? I've commented elsewhere as well that we might want to add to the validate and/or recommends about this.

@jimschubert

Copy link
Copy Markdown
Member

This spec passes validation at: https://apitools.dev/swagger-parser/online/#

Just a heads up that our CLI also validates:

openapi-generator validate -i openapi.yml

@jimschubert
jimschubert merged commit c882338 into OpenAPITools:masterDec 4, 2019
@spacether
spacether deleted the fixes_oneof_class branch December 4, 2019 03:01
@spacether
spacether restored the fixes_oneof_class branch February 3, 2020 17:48
@spacether
spacether deleted the fixes_oneof_class branch April 30, 2020 03:49
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.

4 participants

@spacether@jimschubert@lwlee2608@jeff9finger
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

[Java/Core] Adds properties to ComposedSchema models when they exist - #4482

Merged
jimschubert merged 2 commits into
OpenAPITools:masterfrom
spacether:fixes_oneof_class
Dec 4, 2019
Merged

[Java/Core] Adds properties to ComposedSchema models when they exist#4482
jimschubert merged 2 commits into
OpenAPITools:masterfrom
spacether:fixes_oneof_class

Conversation

@spacether

@spacetherspacether commented Nov 13, 2019

Copy link
Copy Markdown
Contributor

This PR fixes this issue:
#4515

Currently, when we process composedSchemas, we are not including any properties that are described in the properties section of that model's schema. An example is the below fruit model, which leaves out the color property when we ingest it and make a model.

openapi: 3.0.1
info:
title: fruity
version: 0.0.1
paths:
/:
get:
responses:
'200':
description: desc
content:
application/json:
schema:
$ref: '#/components/schemas/fruit'
components:
schemas:
fruit:
title: fruit
properties:
color:
type: string
oneOf:
- $ref: '#/components/schemas/apple'
- $ref: '#/components/schemas/banana'
resolved
apple:
title: apple
type: object
properties:
kind:
type: string
banana:
title: banana
type: object
properties:
count:
type: number

This spec passes validation at: https://apitools.dev/swagger-parser/online/#

This PR fixes this issue, adding properties to the composed model.
We also add a test in DefaultCodegenTest.java where we check that the fruit model contains the color property.

This issue was also recently noticed and fixed in swagger-codegen at: swagger-api/swagger-codegen#9827

Note: additional properties should also be allowed in composed schemas, but that feature is blocked by an upstream bug in swagger-parser. I've included a commented out additionalproperties property in the fruit spec, commented out code to process it in DefaultCodegen.java. Data in both locations links to the open swagger-parser issue which I created at: swagger-api/swagger-parser#1252

  • Read the contribution guidelines.
  • If contributing template-only or documentation-only changes which will change sample output, build the project before.
  • Run the shell script(s) under ./bin/ (or Windows batch scripts under.\bin\windows) to update Petstore samples related to your fix. This is important, as CI jobs will verify all generator outputs of your HEAD commit, and these must match the expectations made by your contribution. You only need to run ./bin/{LANG}-petstore.sh, ./bin/openapi3/{LANG}-petstore.sh if updating the code or mustache templates for a language ({LANG}) (e.g. php, ruby, python, etc).
  • File the PR against the correct branch: master, 4.3.x, 5.0.x. Default: master.
  • Copy the technical committee to review the pull request if your PR is targeting a particular programming language.

Java Technical Committee
@bbdouglas (2017/07) @sreeshas (2017/08) @jfiala (2017/08) @lukoyanov (2017/09) @cbornet (2017/09) @jeff9finger (2018/01) @karismann (2019/03) @Zomzog (2019/04) @lwlee2608 (2019/10)

Core Team
@wing328 (2015/07) ❤️
@jimschubert (2016/05) ❤️
@cbornet (2016/05)
@ackintosh (2018/02) ❤️
@jmini (2018/04) ❤️
@etherealjoy (2019/06)

@spacetherspacether changed the title Adds properties to ComposedSchema models when they exist[Java] Adds properties to ComposedSchema models when they existNov 13, 2019
@spacetherspacether mentioned this pull request Nov 17, 2019
5 tasks

@lwlee2608lwlee2608 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 to me. It is is identical with my PR #4516 . I shall cancel my PR since this is done earlier.

I believe you should cc the core member instead of java technical committee.

@spacetherspacether changed the title [Java] Adds properties to ComposedSchema models when they exist[Java/Core] Adds properties to ComposedSchema models when they existNov 18, 2019
@spacether

Copy link
Copy Markdown
ContributorAuthor

Looks good to me. It is is identical with my PR #4515. I shall cancel my PR since this is done earlier.

I believe you should cc the core member instead of java technical committee.

Ah, didn't know that. I just cced them, thanks!

@lwlee2608lwlee2608 mentioned this pull request Nov 18, 2019
5 tasks
@spacether

spacether commented Nov 22, 2019

Copy link
Copy Markdown
ContributorAuthor

Core Team: @wing328@jimschubert@cbornet@ackintosh@jmini@etherealjoy
Gentle reminder that this still needs a review

@jeff9fingerjeff9finger left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

LGTM 👍

@spacether

Copy link
Copy Markdown
ContributorAuthor

@wing328 these changes were approved 8 days ago. Is there a milestone that they can be added to? Is any more work required in the PR?

@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.

Awesome.

Comment on lines +25 to +27
# additionalProperties:
# type: string
# uncomment this when https://github.com/swagger-api/swagger-parser/issues/1252 is resolved

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.

I wouldn't imagine this will get fixed anytime soon in swagger-parser for the 3.0 specification (the revision versions 3.0.1/3.0.2 are supposedly documentation-only changes).

The behavior you're seeing where this returns MapSchema is defined behavior: https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#model-with-mapdictionary-properties

The requested behavior is undefined, as there's not enough clarity in the specification around constraints of using oneOf. It should be that oneOf can only coexist with discriminator.

oneOf is taken from JSON Schema's specification Section 9.2.1.3, which says:

This keyword's value MUST be a non-empty array. Each item of the array MUST be a valid JSON Schema.

An instance validates successfully against this keyword if it validates successfully against exactly one schema defined by this keyword's value.

Meaning your example is only a valid object if it is exactly apple or exactly banana, and no dynamic properties via additionalProperties are allowed due to the use of MUST rather than SHOULD in the JSON Schema specification.

The discriminator support for oneOf is a JSON Schema extension defined in the OAS Composition and Inheritance (Polymorphism) section.

Ideally, a spec with oneOf any anything besides discriminator should fail validation. We could consider adding this strict validation to OpenAPI Generator, or at least as a recommendation via the --recommend flag to the validate command.

addVars(m, unaliasPropertySchema(schema.getProperties()), schema.getRequired(), null, null);
}

// uncomment this when https://github.com/swagger-api/swagger-parser/issues/1252 is resolved

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.

See my comment on the example spec document in this PR.


// if schema has properties outside of allOf/oneOf/anyOf also add them to m
if (schema.getProperties() != null) {
addVars(m, unaliasPropertySchema(schema.getProperties()), schema.getRequired(), null, null);

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.

@wing328 See my other comment in this PR. Constraints around structures containing oneOf aren't very clearly defined in OAS 3.x, since the extension to include discriminator makes it look like any Schema properties are valid.

Do you think we should log a warning here, or wrap it the a ! strict spec check, or both? I've commented elsewhere as well that we might want to add to the validate and/or recommends about this.

@jimschubert

Copy link
Copy Markdown
Member

This spec passes validation at: https://apitools.dev/swagger-parser/online/#

Just a heads up that our CLI also validates:

openapi-generator validate -i openapi.yml

@jimschubert
jimschubert merged commit c882338 into OpenAPITools:masterDec 4, 2019
@spacether
spacether deleted the fixes_oneof_class branch December 4, 2019 03:01
@spacether
spacether restored the fixes_oneof_class branch February 3, 2020 17:48
@spacether
spacether deleted the fixes_oneof_class branch April 30, 2020 03:49
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.

4 participants

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

[Java/Core] Adds properties to ComposedSchema models when they exist - #4482

Merged
jimschubert merged 2 commits into
OpenAPITools:masterfrom
spacether:fixes_oneof_class
Dec 4, 2019
Merged

[Java/Core] Adds properties to ComposedSchema models when they exist#4482
jimschubert merged 2 commits into
OpenAPITools:masterfrom
spacether:fixes_oneof_class

Conversation

@spacether

@spacetherspacether commented Nov 13, 2019

Copy link
Copy Markdown
Contributor

This PR fixes this issue:
#4515

Currently, when we process composedSchemas, we are not including any properties that are described in the properties section of that model's schema. An example is the below fruit model, which leaves out the color property when we ingest it and make a model.

openapi: 3.0.1
info:
title: fruity
version: 0.0.1
paths:
/:
get:
responses:
'200':
description: desc
content:
application/json:
schema:
$ref: '#/components/schemas/fruit'
components:
schemas:
fruit:
title: fruit
properties:
color:
type: string
oneOf:
- $ref: '#/components/schemas/apple'
- $ref: '#/components/schemas/banana'
resolved
apple:
title: apple
type: object
properties:
kind:
type: string
banana:
title: banana
type: object
properties:
count:
type: number

This spec passes validation at: https://apitools.dev/swagger-parser/online/#

This PR fixes this issue, adding properties to the composed model.
We also add a test in DefaultCodegenTest.java where we check that the fruit model contains the color property.

This issue was also recently noticed and fixed in swagger-codegen at: swagger-api/swagger-codegen#9827

Note: additional properties should also be allowed in composed schemas, but that feature is blocked by an upstream bug in swagger-parser. I've included a commented out additionalproperties property in the fruit spec, commented out code to process it in DefaultCodegen.java. Data in both locations links to the open swagger-parser issue which I created at: swagger-api/swagger-parser#1252

  • Read the contribution guidelines.
  • If contributing template-only or documentation-only changes which will change sample output, build the project before.
  • Run the shell script(s) under ./bin/ (or Windows batch scripts under.\bin\windows) to update Petstore samples related to your fix. This is important, as CI jobs will verify all generator outputs of your HEAD commit, and these must match the expectations made by your contribution. You only need to run ./bin/{LANG}-petstore.sh, ./bin/openapi3/{LANG}-petstore.sh if updating the code or mustache templates for a language ({LANG}) (e.g. php, ruby, python, etc).
  • File the PR against the correct branch: master, 4.3.x, 5.0.x. Default: master.
  • Copy the technical committee to review the pull request if your PR is targeting a particular programming language.

Java Technical Committee
@bbdouglas (2017/07) @sreeshas (2017/08) @jfiala (2017/08) @lukoyanov (2017/09) @cbornet (2017/09) @jeff9finger (2018/01) @karismann (2019/03) @Zomzog (2019/04) @lwlee2608 (2019/10)

Core Team
@wing328 (2015/07) ❤️
@jimschubert (2016/05) ❤️
@cbornet (2016/05)
@ackintosh (2018/02) ❤️
@jmini (2018/04) ❤️
@etherealjoy (2019/06)

@spacetherspacether changed the title Adds properties to ComposedSchema models when they exist[Java] Adds properties to ComposedSchema models when they existNov 13, 2019
@spacetherspacether mentioned this pull request Nov 17, 2019
5 tasks

@lwlee2608lwlee2608 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 to me. It is is identical with my PR #4516 . I shall cancel my PR since this is done earlier.

I believe you should cc the core member instead of java technical committee.

@spacetherspacether changed the title [Java] Adds properties to ComposedSchema models when they exist[Java/Core] Adds properties to ComposedSchema models when they existNov 18, 2019
@spacether

Copy link
Copy Markdown
ContributorAuthor

Looks good to me. It is is identical with my PR #4515. I shall cancel my PR since this is done earlier.

I believe you should cc the core member instead of java technical committee.

Ah, didn't know that. I just cced them, thanks!

@lwlee2608lwlee2608 mentioned this pull request Nov 18, 2019
5 tasks
@spacether

spacether commented Nov 22, 2019

Copy link
Copy Markdown
ContributorAuthor

Core Team: @wing328@jimschubert@cbornet@ackintosh@jmini@etherealjoy
Gentle reminder that this still needs a review

@jeff9fingerjeff9finger left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

LGTM 👍

@spacether

Copy link
Copy Markdown
ContributorAuthor

@wing328 these changes were approved 8 days ago. Is there a milestone that they can be added to? Is any more work required in the PR?

@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.

Awesome.

Comment on lines +25 to +27
# additionalProperties:
# type: string
# uncomment this when https://github.com/swagger-api/swagger-parser/issues/1252 is resolved

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.

I wouldn't imagine this will get fixed anytime soon in swagger-parser for the 3.0 specification (the revision versions 3.0.1/3.0.2 are supposedly documentation-only changes).

The behavior you're seeing where this returns MapSchema is defined behavior: https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#model-with-mapdictionary-properties

The requested behavior is undefined, as there's not enough clarity in the specification around constraints of using oneOf. It should be that oneOf can only coexist with discriminator.

oneOf is taken from JSON Schema's specification Section 9.2.1.3, which says:

This keyword's value MUST be a non-empty array. Each item of the array MUST be a valid JSON Schema.

An instance validates successfully against this keyword if it validates successfully against exactly one schema defined by this keyword's value.

Meaning your example is only a valid object if it is exactly apple or exactly banana, and no dynamic properties via additionalProperties are allowed due to the use of MUST rather than SHOULD in the JSON Schema specification.

The discriminator support for oneOf is a JSON Schema extension defined in the OAS Composition and Inheritance (Polymorphism) section.

Ideally, a spec with oneOf any anything besides discriminator should fail validation. We could consider adding this strict validation to OpenAPI Generator, or at least as a recommendation via the --recommend flag to the validate command.

addVars(m, unaliasPropertySchema(schema.getProperties()), schema.getRequired(), null, null);
}

// uncomment this when https://github.com/swagger-api/swagger-parser/issues/1252 is resolved

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.

See my comment on the example spec document in this PR.


// if schema has properties outside of allOf/oneOf/anyOf also add them to m
if (schema.getProperties() != null) {
addVars(m, unaliasPropertySchema(schema.getProperties()), schema.getRequired(), null, null);

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.

@wing328 See my other comment in this PR. Constraints around structures containing oneOf aren't very clearly defined in OAS 3.x, since the extension to include discriminator makes it look like any Schema properties are valid.

Do you think we should log a warning here, or wrap it the a ! strict spec check, or both? I've commented elsewhere as well that we might want to add to the validate and/or recommends about this.

@jimschubert

Copy link
Copy Markdown
Member

This spec passes validation at: https://apitools.dev/swagger-parser/online/#

Just a heads up that our CLI also validates:

openapi-generator validate -i openapi.yml

@jimschubert
jimschubert merged commit c882338 into OpenAPITools:masterDec 4, 2019
@spacether
spacether deleted the fixes_oneof_class branch December 4, 2019 03:01
@spacether
spacether restored the fixes_oneof_class branch February 3, 2020 17:48
@spacether
spacether deleted the fixes_oneof_class branch April 30, 2020 03:49
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.

4 participants

@spacether@jimschubert@lwlee2608@jeff9finger