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

Fix #9083 #14577: Parse JsonSchema for type in OpenAPI 3.1

  • Review changes

  • Download
  • Email patches
  • Plain diff
Open Administrator requested to merge github/fork/GuillaumeSmaha/fix_14577_3.1_responses_array into master 2 years ago
  • Overview 4
  • Commits 9
  • Pipelines 1
  • Changes 82

Created by: GuillaumeSmaha

Since swagger-core 2.2.0 for OpenAPI 3.1, a set of type can be used instead of an unique type: https://github.com/swagger-api/swagger-core/blob/v2.2.8/modules/swagger-models/src/main/java/io/swagger/v3/oas/models/media/Schema.java#L107-L111

In the case of an array, the schema is not an ArraySchema but an JsonSchema with a set of types defined to [array]. Example of usage of JsonSchema if OpenAPI is 3.1: https://github.com/swagger-api/swagger-parser/blob/v2.1.8/modules/swagger-parser-v3/src/main/java/io/swagger/v3/parser/util/ResolverFully.java#L383-L390

See https://github.com/OpenAPITools/openapi-generator/issues/14577#issuecomment-1418778197 for example of the JsonSchema in getPrimitiveType(Schema).

To solve that, ModelUtils.isArraySchema(schema) is now returning true if the schema is an instance of ArraySchema or JsonSchema with only one type and this type need to be equal to array.

The function getSchemaItems(schema) is moved to ModelUtils.getArrayItems(schema) to be used in ModelUtils and it is now used everywhere to get items in a schema whatever the type of the schema (ArraySchema or JsonSchema)

Add test testOpenAPI310ResponsesJsonSchemaIsArray to validate JsonSchema is correctly translate to an array

PR checklist

  • Read the contribution guidelines.
  • Pull Request title clearly describes the work in the pull request and Pull Request description provides details about how to validate the work. Missing information here may result in delayed response from the community.
  • Run the following to build the project and update samples:
    ./mvnw clean package 
    ./bin/generate-samples.sh
    ./bin/utils/export_docs_generators.sh
    Commit all changed files. 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/configs/java*. For Windows users, please run the script in Git BASH.
  • In case you are adding a new generator, run the following additional script :
    ./bin/utils/ensure-up-to-date.sh
    Commit all changed files.
  • File the PR against the correct branch: master (6.3.0) (minor release - breaking changes with fallbacks), 7.0.x (breaking changes without fallbacks)
  • If your PR is targeting a particular programming language, @mention the technical committee members, so they are more likely to review the pull request. This is a core change @wing328
Compare
  • version 1
    678dc001
    2 years ago

  • master (base)

and
  • latest version
    678dc001
    9 commits, 2 years ago

  • version 1
    678dc001
    9 commits, 2 years ago

82 files
+ 1417
- 353

    Preferences

    File browser
    Compare changes
modules/openap‎i-generator/src‎
main/java/org/ope‎napitools/codegen‎
exam‎ples‎
ExampleGen‎erator.java‎ +4 -6
XmlExampleGe‎nerator.java‎ +1 -3
lang‎uages‎
AbstractAda‎Codegen.java‎ +1 -2
AbstractApex‎Codegen.java‎ +3 -4
AbstractDart‎Codegen.java‎ +2 -2
AbstractEiffe‎lCodegen.java‎ +1 -2
AbstractGoC‎odegen.java‎ +1 -2
AbstractGraph‎QLCodegen.java‎ +1 -2
AbstractJava‎Codegen.java‎ +4 -4
AbstractJuli‎aCodegen.java‎ +1 -2
AbstractKotli‎nCodegen.java‎ +3 -3
AbstractPhp‎Codegen.java‎ +2 -3
AbstractPythonConnex‎ionServerCodegen.java‎ +1 -2
AbstractRuby‎Codegen.java‎ +1 -1
AbstractScal‎aCodegen.java‎ +1 -1
AbstractTypeScript‎ClientCodegen.java‎ +5 -6
AndroidClien‎tCodegen.java‎ +1 -2
ApexClientC‎odegen.java‎ +1 -1
BashClientC‎odegen.java‎ +1 -2
CLibcurlClien‎tCodegen.java‎ +1 -1
CSharpNetCoreCl‎ientCodegen.java‎ +1 -1
CSharpNetCoreReduce‎dClientCodegen.java‎ +1 -1
ClojureClien‎tCodegen.java‎ +2 -3
ConfluenceWik‎iCodegen.java‎ +1 -2
CppPistacheSer‎verCodegen.java‎ +1 -2
CppQtAbstrac‎tCodegen.java‎ +2 -4
CppRestSdkClie‎ntCodegen.java‎ +1 -2
CppRestbedServ‎erCodegen.java‎ +1 -2
CppRestbedServerDep‎recatedCodegen.java‎ +1 -2
CrystalClien‎tCodegen.java‎ +1 -1
ElixirClient‎Codegen.java‎ +1 -2
ElmClientC‎odegen.java‎ +1 -2
GoServerCo‎degen.java‎ +1 -1
GraphQLNodeJSExpres‎sServerCodegen.java‎ +1 -2
HaskellHttpCli‎entCodegen.java‎ +1 -2
HaskellServan‎tCodegen.java‎ +1 -2
HaskellYesodSer‎verCodegen.java‎ +1 -2
JMeterClient‎Codegen.java‎ +1 -2
JavaCXFServe‎rCodegen.java‎ +1 -1
JavascriptApolloC‎lientCodegen.java‎ +2 -3
JavascriptClie‎ntCodegen.java‎ +2 -3
JavascriptClosureAngu‎larClientCodegen.java‎ +1 -2
LuaClientC‎odegen.java‎ +1 -2
NimClientC‎odegen.java‎ +1 -2
OCamlClient‎Codegen.java‎ +10 -10
ObjcClientC‎odegen.java‎ +1 -2
PerlClientC‎odegen.java‎ +1 -2
PhpDataTransferC‎lientCodegen.java‎ +2 -2
PhpMezzioPathHandle‎rServerCodegen.java‎ +2 -2
PhpSilexServe‎rCodegen.java‎ +1 -2
PhpSymfonyServ‎erCodegen.java‎ +1 -2
PowerShellClie‎ntCodegen.java‎ +1 -2
ProtobufSchem‎aCodegen.java‎ +1 -2
PythonClient‎Codegen.java‎ +8 -11
PythonFastAPISe‎rverCodegen.java‎ +1 -2
PythonLegacyCli‎entCodegen.java‎ +1 -2
PythonNextgenCl‎ientCodegen.java‎ +1 -2
PythonPriorCli‎entCodegen.java‎ +5 -8
RClientCo‎degen.java‎ +1 -2
RustClientC‎odegen.java‎ +2 -3
RustServerC‎odegen.java‎ +4 -6
ScalaFinchServ‎erCodegen.java‎ +1 -2
ScalaGatling‎Codegen.java‎ +1 -2
ScalaPlayFramework‎ServerCodegen.java‎ +1 -1
StaticHtml2G‎enerator.java‎ +1 -2
StaticHtmlGe‎nerator.java‎ +1 -2
Swift5Client‎Codegen.java‎ +1 -2
TypeScriptAxiosC‎lientCodegen.java‎ +1 -1
TypeScriptClie‎ntCodegen.java‎ +8 -11
TypeScriptNodeCl‎ientCodegen.java‎ +1 -1
TypeScriptRxjsCl‎ientCodegen.java‎ +1 -1
ut‎ils‎
ModelUt‎ils.java‎ +134 -58
validat‎ions/oas‎
OpenApiSchemaV‎alidations.java‎ +2 -2
DefaultCo‎degen.java‎ +83 -70
InlineModelR‎esolver.java‎ +36 -33
OpenAPINorm‎alizer.java‎ +5 -4
te‎st‎
java/org/opena‎pitools/codegen‎
DefaultCode‎genTest.java‎ +419 -0
reso‎urces‎
3‎_0‎
oas31-compose‎d-schemas.yaml‎ +202 -0
oas31-map-s‎chemas.yaml‎ +70 -0
3‎_1‎
oas31-compose‎d-schemas.yaml‎ +175 -0
oas31-map-s‎chemas.yaml‎ +70 -0
parameter-primi‎tive-types.yaml‎ +97 -0
modules/openapi-generator/src/main/java/org/openapitools/codegen/examples/ExampleGenerator.java
+ 4
- 6
  • View file @ 678dc001

  • Edit in single-file editor

  • Open in Web IDE


@@ -19,7 +19,6 @@ package org.openapitools.codegen.examples;
import io.swagger.v3.core.util.Json;
import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.media.ArraySchema;
import io.swagger.v3.oas.models.media.Schema;
import org.apache.commons.lang3.StringUtils;
import org.openapitools.codegen.utils.ModelUtils;
@@ -79,10 +78,9 @@ public class ExampleGenerator {
}
if (ModelUtils.isArraySchema(responseSchema)) { // array of schema
ArraySchema as = (ArraySchema) responseSchema;
if (as.getItems() != null) { // array of primitive types
if (ModelUtils.getArrayItems(responseSchema) != null) { // array of primitive types
return generate((Map<String, Object>) responseSchema.getExample(),
new ArrayList<>(producesInfo), as);
new ArrayList<>(producesInfo), responseSchema);
} else {
// TODO log warning message as such case is not handled at the moment
return null;
@@ -229,9 +227,9 @@ public class ExampleGenerator {
}
return Boolean.TRUE;
} else if (ModelUtils.isArraySchema(property)) {
Schema innerType = ((ArraySchema) property).getItems();
Schema innerType = ModelUtils.getArrayItems(property);
if (innerType != null) {
int arrayLength = null == ((ArraySchema) property).getMaxItems() ? 2 : ((ArraySchema) property).getMaxItems();
int arrayLength = null == property.getMaxItems() ? 2 : property.getMaxItems();
// avoid memory issues by limiting to max. 5 items
arrayLength = Math.min(arrayLength, 5);
Object[] objectProperties = new Object[arrayLength];
modules/openapi-generator/src/main/java/org/openapitools/codegen/examples/XmlExampleGenerator.java
+ 1
- 3
  • View file @ 678dc001

  • Edit in single-file editor

  • Open in Web IDE


@@ -17,7 +17,6 @@
package org.openapitools.codegen.examples;
import io.swagger.v3.oas.models.media.ArraySchema;
import io.swagger.v3.oas.models.media.Schema;
import io.swagger.v3.oas.models.media.XML;
import org.apache.commons.lang3.StringUtils;
@@ -128,8 +127,7 @@ public class XmlExampleGenerator {
StringBuilder sb = new StringBuilder();
if (ModelUtils.isArraySchema(schema)) {
ArraySchema as = (ArraySchema) schema;
Schema inner = as.getItems();
Schema inner = ModelUtils.getArrayItems(schema);
boolean wrapped = false;
if (schema.getXml() != null && schema.getXml().getWrapped() != null && schema.getXml().getWrapped()) {
wrapped = true;
modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractAdaCodegen.java
+ 1
- 2
  • View file @ 678dc001

  • Edit in single-file editor

  • Open in Web IDE


@@ -451,8 +451,7 @@ abstract public class AbstractAdaCodegen extends DefaultCodegen implements Codeg
}
if (ModelUtils.isArraySchema(p)) {
ArraySchema ap = (ArraySchema) p;
Schema inner = ap.getItems();
Schema inner = ModelUtils.getArrayItems(p);
return getTypeDeclaration(inner) + "_Vectors.Vector";
}
if (ModelUtils.isMapSchema(p)) {
modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractApexCodegen.java
+ 3
- 4
  • View file @ 678dc001

  • Edit in single-file editor

  • Open in Web IDE


@@ -188,10 +188,9 @@ public abstract class AbstractApexCodegen extends DefaultCodegen implements Code
@Override
public String getTypeDeclaration(Schema p) {
if (ModelUtils.isArraySchema(p)) {
ArraySchema ap = (ArraySchema) p;
Schema inner = ap.getItems();
Schema inner = ModelUtils.getArrayItems(p);
if (inner == null) {
LOGGER.warn("{}(array property) does not have a proper inner type defined", ap.getName());
LOGGER.warn("{}(array property) does not have a proper inner type defined", p.getName());
// TODO maybe better defaulting to StringProperty than returning null
return null;
}
@@ -318,7 +317,7 @@ public abstract class AbstractApexCodegen extends DefaultCodegen implements Code
if (ModelUtils.isArraySchema(p)) {
example = "new " + getTypeDeclaration(p) + "{" + toExampleValue(
((ArraySchema) p).getItems()) + "}";
ModelUtils.getArrayItems(p)) + "}";
} else if (ModelUtils.isBooleanSchema(p)) {
example = String.valueOf(!"false".equals(example));
} else if (ModelUtils.isByteArraySchema(p)) {
modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractDartCodegen.java
+ 2
- 2
  • View file @ 678dc001

  • Edit in single-file editor

  • Open in Web IDE


@@ -493,7 +493,7 @@ public abstract class AbstractDartCodegen extends DefaultCodegen {
Schema<?> schema = unaliasSchema(p);
Schema<?> target = ModelUtils.isGenerateAliasAsModel() ? p : schema;
if (ModelUtils.isArraySchema(target)) {
Schema<?> items = getSchemaItems((ArraySchema) schema);
Schema<?> items = ModelUtils.getArrayItems(schema);
return getSchemaType(target) + "<" + getTypeDeclaration(items) + ">";
}
if (ModelUtils.isMapSchema(target)) {
@@ -558,7 +558,7 @@ public abstract class AbstractDartCodegen extends DefaultCodegen {
// Handle composed properties
if (ModelUtils.isComposedSchema(p)) {
ComposedSchema composed = (ComposedSchema) p;
Schema<?> composed = p;
// Count the occurrences of allOf/anyOf/oneOf with exactly one child element
long count = Stream.of(composed.getAllOf(), composed.getAnyOf(), composed.getOneOf())
0 Assignees
None
Assign to
0 Reviewers
None
Request review from
Labels
0
None
0
None
    Assign labels
  • Manage project labels

Milestone
No milestone
None
None
Time tracking
No estimate or time spent
Lock merge request
Unlocked
2
2 participants
Administrator
William Cheng
Reference: OpenAPITools/openapi-generator!14629
Source branch: github/fork/GuillaumeSmaha/fix_14577_3.1_responses_array

Menu

Explore Projects Groups Snippets