Skip to content

Commit

Permalink
Feat adds has discriminator with non empty mapping (#9667)
Browse files Browse the repository at this point in the history
* Adds hasDiscriminatorWithNonEmptyMapping getter and setter

* Removes venv

* Adds hasDiscriminatorWithNonEmptyMapping to CodegenModel

* Removes python-experimental folder

* Adds hasDiscriminatorWithNonEmptyMapping to CodegenProperty

* Adds hasDiscriminatorWithNonEmptyMapping to CodegenParameter

* Adds hasDiscriminatorWithNonEmptyMapping to CodegenResponse

* Sets hasDiscriminatorWithNonEmptyMapping in codegenModels

* Samples updated

* Adds getHasDiscriminatorWithNonEmptyMappin checks in existing discriminator tests
  • Loading branch information
spacether authored Aug 7, 2021
1 parent 930643b commit cb71ae9
Show file tree
Hide file tree
Showing 9 changed files with 77 additions and 11 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -155,6 +155,7 @@ public class CodegenModel implements IJsonSchemaValidationProperties {
private CodegenProperty additionalProperties;
private boolean isModel;
private boolean hasRequiredVars;
private boolean hasDiscriminatorWithNonEmptyMapping;

public String getAdditionalPropertiesType() {
return additionalPropertiesType;
Expand Down Expand Up @@ -316,6 +317,9 @@ public CodegenDiscriminator getDiscriminator() {

public void setDiscriminator(CodegenDiscriminator discriminator) {
this.discriminator = discriminator;
if (discriminator instanceof CodegenDiscriminator && !discriminator.getMappedModels().isEmpty()) {
this.hasDiscriminatorWithNonEmptyMapping = true;
}
}

/**
Expand Down Expand Up @@ -768,6 +772,14 @@ public void setHasRequired(boolean hasRequired) {
this.hasRequired = hasRequired;
}

@Override
public boolean getHasDiscriminatorWithNonEmptyMapping() { return hasDiscriminatorWithNonEmptyMapping; };

@Override
public void setHasDiscriminatorWithNonEmptyMapping(boolean hasDiscriminatorWithNonEmptyMapping) {
this.hasDiscriminatorWithNonEmptyMapping = hasDiscriminatorWithNonEmptyMapping;
}

@Override
public boolean equals(Object o) {
if (this == o) return true;
Expand Down Expand Up @@ -801,6 +813,7 @@ public boolean equals(Object o) {
hasOnlyReadOnly == that.hasOnlyReadOnly &&
isNull == that.isNull &&
hasValidation == that.hasValidation &&
hasDiscriminatorWithNonEmptyMapping == that.getHasDiscriminatorWithNonEmptyMapping() &&
getAdditionalPropertiesIsAnyType() == that.getAdditionalPropertiesIsAnyType() &&
getUniqueItems() == that.getUniqueItems() &&
getExclusiveMinimum() == that.getExclusiveMinimum() &&
Expand Down Expand Up @@ -874,7 +887,7 @@ hasChildren, isMap, isDeprecated, hasOnlyReadOnly, getExternalDocumentation(), g
getAdditionalPropertiesType(), getMaxProperties(), getMinProperties(), getUniqueItems(), getMaxItems(),
getMinItems(), getMaxLength(), getMinLength(), getExclusiveMinimum(), getExclusiveMaximum(), getMinimum(),
getMaximum(), getPattern(), getMultipleOf(), getItems(), getAdditionalProperties(), getIsModel(),
getAdditionalPropertiesIsAnyType());
getAdditionalPropertiesIsAnyType(), hasDiscriminatorWithNonEmptyMapping);
}

@Override
Expand Down Expand Up @@ -964,6 +977,7 @@ public String toString() {
sb.append(", isNull='").append(isNull);
sb.append(", hasValidation='").append(hasValidation);
sb.append(", getAdditionalPropertiesIsAnyType=").append(getAdditionalPropertiesIsAnyType());
sb.append(", getHasDiscriminatorWithNonEmptyMapping=").append(hasDiscriminatorWithNonEmptyMapping);
sb.append('}');
return sb.toString();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,7 @@ public class CodegenParameter implements IJsonSchemaValidationProperties {
private Integer minProperties;
public boolean isNull;
private boolean hasRequired;
private boolean hasDiscriminatorWithNonEmptyMapping;

public CodegenParameter copy() {
CodegenParameter output = new CodegenParameter();
Expand Down Expand Up @@ -156,6 +157,7 @@ public CodegenParameter copy() {
output.setAdditionalPropertiesIsAnyType(this.getAdditionalPropertiesIsAnyType());
output.setHasVars(this.hasVars);
output.setHasRequired(this.hasRequired);
output.setHasDiscriminatorWithNonEmptyMapping(this.hasDiscriminatorWithNonEmptyMapping);

if (this._enum != null) {
output._enum = new ArrayList<String>(this._enum);
Expand Down Expand Up @@ -213,7 +215,7 @@ public CodegenParameter copy() {

@Override
public int hashCode() {
return Objects.hash(isFormParam, isQueryParam, isPathParam, isHeaderParam, isCookieParam, isBodyParam, isContainer, isCollectionFormatMulti, isPrimitiveType, isModel, isExplode, baseName, paramName, dataType, datatypeWithEnum, dataFormat, collectionFormat, description, unescapedDescription, baseType, defaultValue, enumName, style, isDeepObject, example, jsonSchema, isString, isNumeric, isInteger, isLong, isNumber, isFloat, isDouble, isDecimal, isByteArray, isBinary, isBoolean, isDate, isDateTime, isUuid, isUri, isEmail, isFreeFormObject, isAnyType, isArray, isMap, isFile, isEnum, _enum, allowableValues, items, mostInnerItems, additionalProperties, vars, requiredVars, vendorExtensions, hasValidation, getMaxProperties(), getMinProperties(), isNullable, isDeprecated, required, getMaximum(), getExclusiveMaximum(), getMinimum(), getExclusiveMinimum(), getMaxLength(), getMinLength(), getPattern(), getMaxItems(), getMinItems(), getUniqueItems(), contentType, multipleOf, isNull, additionalPropertiesIsAnyType, hasVars, hasRequired, isShort, isUnboundedInteger);
return Objects.hash(isFormParam, isQueryParam, isPathParam, isHeaderParam, isCookieParam, isBodyParam, isContainer, isCollectionFormatMulti, isPrimitiveType, isModel, isExplode, baseName, paramName, dataType, datatypeWithEnum, dataFormat, collectionFormat, description, unescapedDescription, baseType, defaultValue, enumName, style, isDeepObject, example, jsonSchema, isString, isNumeric, isInteger, isLong, isNumber, isFloat, isDouble, isDecimal, isByteArray, isBinary, isBoolean, isDate, isDateTime, isUuid, isUri, isEmail, isFreeFormObject, isAnyType, isArray, isMap, isFile, isEnum, _enum, allowableValues, items, mostInnerItems, additionalProperties, vars, requiredVars, vendorExtensions, hasValidation, getMaxProperties(), getMinProperties(), isNullable, isDeprecated, required, getMaximum(), getExclusiveMaximum(), getMinimum(), getExclusiveMinimum(), getMaxLength(), getMinLength(), getPattern(), getMaxItems(), getMinItems(), getUniqueItems(), contentType, multipleOf, isNull, additionalPropertiesIsAnyType, hasVars, hasRequired, isShort, isUnboundedInteger, hasDiscriminatorWithNonEmptyMapping);
}

@Override
Expand Down Expand Up @@ -261,6 +263,7 @@ public boolean equals(Object o) {
isDeprecated == that.isDeprecated &&
required == that.required &&
isNull == that.isNull &&
hasDiscriminatorWithNonEmptyMapping && that.getHasDiscriminatorWithNonEmptyMapping() &&
getAdditionalPropertiesIsAnyType() == that.getAdditionalPropertiesIsAnyType() &&
getHasVars() == that.getHasVars() &&
getHasRequired() == that.getHasRequired() &&
Expand Down Expand Up @@ -386,6 +389,7 @@ public String toString() {
sb.append(", getAdditionalPropertiesIsAnyType=").append(additionalPropertiesIsAnyType);
sb.append(", getHasVars=").append(hasVars);
sb.append(", getHasRequired=").append(hasRequired);
sb.append(", getHasDiscriminatorWithNonEmptyMapping=").append(hasDiscriminatorWithNonEmptyMapping);
sb.append('}');
return sb.toString();
}
Expand Down Expand Up @@ -667,5 +671,13 @@ public boolean getHasRequired() {
public void setHasRequired(boolean hasRequired) {
this.hasRequired = hasRequired;
}

@Override
public boolean getHasDiscriminatorWithNonEmptyMapping() { return hasDiscriminatorWithNonEmptyMapping; };

@Override
public void setHasDiscriminatorWithNonEmptyMapping(boolean hasDiscriminatorWithNonEmptyMapping) {
this.hasDiscriminatorWithNonEmptyMapping = hasDiscriminatorWithNonEmptyMapping;
}
}

Original file line number Diff line number Diff line change
Expand Up @@ -190,6 +190,7 @@ public class CodegenProperty implements Cloneable, IJsonSchemaValidationProperti
private boolean additionalPropertiesIsAnyType;
private boolean hasVars;
private boolean hasRequired;
private boolean hasDiscriminatorWithNonEmptyMapping;

public String getBaseName() {
return baseName;
Expand Down Expand Up @@ -754,6 +755,14 @@ public void setHasRequired(boolean hasRequired) {
this.hasRequired = hasRequired;
}

@Override
public boolean getHasDiscriminatorWithNonEmptyMapping() { return hasDiscriminatorWithNonEmptyMapping; };

@Override
public void setHasDiscriminatorWithNonEmptyMapping(boolean hasDiscriminatorWithNonEmptyMapping) {
this.hasDiscriminatorWithNonEmptyMapping = hasDiscriminatorWithNonEmptyMapping;
}

@Override
public String toString() {
final StringBuilder sb = new StringBuilder("CodegenProperty{");
Expand Down Expand Up @@ -848,6 +857,7 @@ public String toString() {
sb.append(", getAdditionalPropertiesIsAnyType=").append(getAdditionalPropertiesIsAnyType());
sb.append(", getHasVars=").append(getHasVars());
sb.append(", getHasRequired=").append(getHasRequired());
sb.append(", getHasDiscriminatorWithNonEmptyMapping=").append(hasDiscriminatorWithNonEmptyMapping);
sb.append('}');
return sb.toString();
}
Expand Down Expand Up @@ -899,6 +909,7 @@ public boolean equals(Object o) {
isXmlAttribute == that.isXmlAttribute &&
isXmlWrapped == that.isXmlWrapped &&
isNull == that.isNull &&
hasDiscriminatorWithNonEmptyMapping == that.hasDiscriminatorWithNonEmptyMapping &&
getAdditionalPropertiesIsAnyType() == that.getAdditionalPropertiesIsAnyType() &&
getHasVars() == that.getHasVars() &&
getHasRequired() ==that.getHasRequired() &&
Expand Down Expand Up @@ -963,6 +974,7 @@ public int hashCode() {
items, mostInnerItems, additionalProperties, vars, requiredVars,
vendorExtensions, hasValidation, isInherited, discriminatorValue, nameInCamelCase,
nameInSnakeCase, enumName, maxItems, minItems, isXmlAttribute, xmlPrefix, xmlName,
xmlNamespace, isXmlWrapped, isNull, additionalPropertiesIsAnyType, hasVars, hasRequired);
xmlNamespace, isXmlWrapped, isNull, additionalPropertiesIsAnyType, hasVars, hasRequired,
hasDiscriminatorWithNonEmptyMapping);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,7 @@ public class CodegenResponse implements IJsonSchemaValidationProperties {
private boolean additionalPropertiesIsAnyType;
private boolean hasVars;
private boolean hasRequired;
private boolean hasDiscriminatorWithNonEmptyMapping;

@Override
public int hashCode() {
Expand All @@ -94,7 +95,8 @@ public int hashCode() {
vars, requiredVars, isNull, hasValidation, isShort, isUnboundedInteger,
getMaxProperties(), getMinProperties(), uniqueItems, getMaxItems(), getMinItems(), getMaxLength(),
getMinLength(), exclusiveMinimum, exclusiveMaximum, getMinimum(), getMaximum(), getPattern(),
is1xx, is2xx, is3xx, is4xx, is5xx, additionalPropertiesIsAnyType, hasVars, hasRequired);
is1xx, is2xx, is3xx, is4xx, is5xx, additionalPropertiesIsAnyType, hasVars, hasRequired,
hasDiscriminatorWithNonEmptyMapping);
}

@Override
Expand Down Expand Up @@ -138,6 +140,7 @@ public boolean equals(Object o) {
is3xx == that.is3xx &&
is4xx == that.is4xx &&
is5xx == that.is5xx &&
hasDiscriminatorWithNonEmptyMapping == that.getHasDiscriminatorWithNonEmptyMapping() &&
getAdditionalPropertiesIsAnyType() == that.getAdditionalPropertiesIsAnyType() &&
getHasVars() == that.getHasVars() &&
getHasRequired() == that.getHasRequired() &&
Expand Down Expand Up @@ -478,6 +481,7 @@ public String toString() {
sb.append(", getAdditionalPropertiesIsAnyType=").append(additionalPropertiesIsAnyType);
sb.append(", getHasVars=").append(hasVars);
sb.append(", getHasRequired=").append(hasRequired);
sb.append(", getHasDiscriminatorWithNonEmptyMapping=").append(hasDiscriminatorWithNonEmptyMapping);
sb.append('}');
return sb.toString();
}
Expand Down Expand Up @@ -534,4 +538,12 @@ public boolean getHasVars() {
public void setHasVars(boolean hasVars) {
this.hasVars = hasVars;
}

@Override
public boolean getHasDiscriminatorWithNonEmptyMapping() { return hasDiscriminatorWithNonEmptyMapping; };

@Override
public void setHasDiscriminatorWithNonEmptyMapping(boolean hasDiscriminatorWithNonEmptyMapping) {
this.hasDiscriminatorWithNonEmptyMapping = hasDiscriminatorWithNonEmptyMapping;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2393,7 +2393,7 @@ public CodegenModel fromModel(String name, Schema schema) {
}
m.isAlias = (typeAliases.containsKey(name)
|| isAliasOfSimpleTypes(schema)); // check if the unaliased schema is an alias of simple OAS types
m.discriminator = createDiscriminator(name, schema, this.openAPI);
m.setDiscriminator(createDiscriminator(name, schema, this.openAPI));
if (!this.getLegacyDiscriminatorBehavior()) {
m.addDiscriminatorMappedModelsImports();
}
Expand Down Expand Up @@ -2453,7 +2453,7 @@ public CodegenModel fromModel(String name, Schema schema) {
for (Schema innerSchema : composed.getAllOf()) { // TODO need to work with anyOf, oneOf as well
if (m.discriminator == null && innerSchema.getDiscriminator() != null) {
LOGGER.debug("discriminator is set to null (not correctly set earlier): {}", name);
m.discriminator = createDiscriminator(name, innerSchema, this.openAPI);
m.setDiscriminator(createDiscriminator(name, innerSchema, this.openAPI));
if (!this.getLegacyDiscriminatorBehavior()) {
m.addDiscriminatorMappedModelsImports();
}
Expand Down Expand Up @@ -6663,7 +6663,7 @@ public void addOneOfInterfaceModel(ComposedSchema cs, String type, OpenAPI openA

CodegenModel cm = new CodegenModel();

cm.discriminator = createDiscriminator("", cs, openAPI);
cm.setDiscriminator(createDiscriminator("", cs, openAPI));
if (!this.getLegacyDiscriminatorBehavior()) {
cm.addDiscriminatorMappedModelsImports();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -122,4 +122,10 @@ public interface IJsonSchemaValidationProperties {
boolean getHasRequired();

void setHasRequired(boolean hasRequired);
}

// discriminators are only supported in request bodies and response payloads per OpenApi
boolean getHasDiscriminatorWithNonEmptyMapping();

// discriminators are only supported in request bodies and response payloads per OpenApi
void setHasDiscriminatorWithNonEmptyMapping(boolean hasDiscriminatorWithNonEmptyMapping);
}
Original file line number Diff line number Diff line change
Expand Up @@ -887,6 +887,7 @@ public void testDiscriminator() {
test.getMappedModels().add(new CodegenDiscriminator.MappedModel("Cat", "Cat"));
test.getMappedModels().add(new CodegenDiscriminator.MappedModel("BigCat", "BigCat"));
Assert.assertEquals(discriminator, test);
Assert.assertEquals(animalModel.getHasDiscriminatorWithNonEmptyMapping(), true);
}

@Test
Expand All @@ -905,6 +906,7 @@ public void testDiscriminatorWithCustomMapping() {
codegen.setOpenAPI(openAPI);
CodegenModel personModel = codegen.fromModel("Person", person);
verifyPersonDiscriminator(personModel.discriminator);
Assert.assertEquals(personModel.getHasDiscriminatorWithNonEmptyMapping(), true);
}

@Test
Expand All @@ -916,6 +918,7 @@ public void testParentName() {
codegen.setOpenAPI(openAPI);
CodegenModel childModel = codegen.fromModel("Child", child);
Assert.assertEquals(childModel.parentSchema, "Person");
Assert.assertEquals(childModel.getHasDiscriminatorWithNonEmptyMapping(), false);
}

@Test
Expand Down Expand Up @@ -989,6 +992,7 @@ public void testComposedSchemaAllOfDiscriminatorMap() {
Schema leafSc = openAPI.getComponents().getSchemas().get(leafModelName);
CodegenModel leafCm = codegen.fromModel(leafModelName, leafSc);
Assert.assertEquals(leafCm.discriminator, emptyMapDisc);
Assert.assertEquals(leafCm.getHasDiscriminatorWithNonEmptyMapping(), false);
}

// the Pet discriminator map contains all animals + Reptile (children + grandchildren)
Expand All @@ -1004,6 +1008,7 @@ public void testComposedSchemaAllOfDiscriminatorMap() {
modelName = "Pet";
sc = openAPI.getComponents().getSchemas().get(modelName);
CodegenModel pet = codegen.fromModel(modelName, sc);
Assert.assertEquals(pet.getHasDiscriminatorWithNonEmptyMapping(), true);
Assert.assertEquals(pet.discriminator, petDisc);

// the Reptile discriminator contains both reptiles
Expand All @@ -1019,6 +1024,7 @@ public void testComposedSchemaAllOfDiscriminatorMap() {
modelName = "Reptile";
sc = openAPI.getComponents().getSchemas().get(modelName);
CodegenModel reptile = codegen.fromModel(modelName, sc);
Assert.assertEquals(reptile.getHasDiscriminatorWithNonEmptyMapping(), true);
Assert.assertEquals(reptile.discriminator, reptileDisc);

// the MyPets discriminator contains Cat and Lizard
Expand All @@ -1034,12 +1040,14 @@ public void testComposedSchemaAllOfDiscriminatorMap() {
modelName = "MyPets";
sc = openAPI.getComponents().getSchemas().get(modelName);
CodegenModel myPets = codegen.fromModel(modelName, sc);
Assert.assertEquals(myPets.getHasDiscriminatorWithNonEmptyMapping(), true);
Assert.assertEquals(myPets.discriminator, myPetDisc);

// the MyPetsNoDisc discriminator is created because all oneOf classes have the same discriminator
modelName = "MyPetsNoDisc";
sc = openAPI.getComponents().getSchemas().get(modelName);
CodegenModel myPetsNoDisc = codegen.fromModel(modelName, sc);
Assert.assertEquals(myPetsNoDisc.getHasDiscriminatorWithNonEmptyMapping(), true);
Assert.assertEquals(myPetsNoDisc.discriminator, myPetDisc);

CodegenModel cm;
Expand All @@ -1052,6 +1060,7 @@ public void testComposedSchemaAllOfDiscriminatorMap() {
hs.add(new CodegenDiscriminator.MappedModel("b", codegen.toModelName("B")));
hs.add(new CodegenDiscriminator.MappedModel("B", codegen.toModelName("B")));
hs.add(new CodegenDiscriminator.MappedModel("C", codegen.toModelName("C")));
Assert.assertEquals(cm.getHasDiscriminatorWithNonEmptyMapping(), true);
Assert.assertEquals(cm.discriminator.getMappedModels(), hs);

// the mapping in b is in B
Expand All @@ -1061,7 +1070,7 @@ public void testComposedSchemaAllOfDiscriminatorMap() {
hs.clear();
hs.add(new CodegenDiscriminator.MappedModel("b", codegen.toModelName("B")));
hs.add(new CodegenDiscriminator.MappedModel("C", codegen.toModelName("C")));

Assert.assertEquals(cm.getHasDiscriminatorWithNonEmptyMapping(), true);
Assert.assertEquals(cm.discriminator.getMappedModels(), hs);

// the mapping in b is in C
Expand All @@ -1070,6 +1079,7 @@ public void testComposedSchemaAllOfDiscriminatorMap() {
cm = codegen.fromModel(modelName, sc);
hs.clear();
hs.add(new CodegenDiscriminator.MappedModel("b", codegen.toModelName("B")));
Assert.assertEquals(cm.getHasDiscriminatorWithNonEmptyMapping(), true);
Assert.assertEquals(cm.discriminator.getMappedModels(), hs);
}

Expand Down
Binary file not shown.
Loading

0 comments on commit cb71ae9

Please sign in to comment.