Skip to content

Commit

Permalink
Java, adds prefixItems (#368)
Browse files Browse the repository at this point in the history
* Turns on prefixItems test cases

* java 310 sample gen

* Adds PrefixItemsValidator validate functionality

* Adds listItemSchema

* Fixes most java tests

* FIxes java tests, sample+docs regen

* Python array types updated

* Adjusts python Unpack usage in tuples
  • Loading branch information
spacether committed Jan 19, 2024
1 parent f4a509e commit 8d47fb2
Show file tree
Hide file tree
Showing 95 changed files with 4,457 additions and 142 deletions.
2 changes: 1 addition & 1 deletion docs/generators/java.md
Original file line number Diff line number Diff line change
Expand Up @@ -305,7 +305,7 @@ These options may be applied as additional-properties (cli) or configOptions (pl
|OneOf|✓|OAS3
|Pattern|✓|OAS2,OAS3
|PatternProperties|✓|OAS3
|PrefixItems||OAS3
|PrefixItems||OAS3
|Properties|✓|OAS2,OAS3
|PropertyNames|✓|OAS3
|Ref|✓|OAS2,OAS3
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -259,6 +259,7 @@ src/main/java/org/openapijsonschematools/client/schemas/validation/OneOfValidato
src/main/java/org/openapijsonschematools/client/schemas/validation/PathToSchemasMap.java
src/main/java/org/openapijsonschematools/client/schemas/validation/PatternPropertiesValidator.java
src/main/java/org/openapijsonschematools/client/schemas/validation/PatternValidator.java
src/main/java/org/openapijsonschematools/client/schemas/validation/PrefixItemsValidator.java
src/main/java/org/openapijsonschematools/client/schemas/validation/PropertiesValidator.java
src/main/java/org/openapijsonschematools/client/schemas/validation/PropertyEntry.java
src/main/java/org/openapijsonschematools/client/schemas/validation/PropertyNamesValidator.java
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,13 +20,16 @@ public ItemsValidator(Class<? extends JsonSchema> items) {
@Nullable List<PathToSchemasMap> containsPathToSchemas,
@Nullable PathToSchemasMap patternPropertiesPathToSchemas
) {
if (!(arg instanceof List)) {
if (!(arg instanceof List<?> listArg)) {
return null;
}
if (listArg.isEmpty()) {
return null;
}
PathToSchemasMap pathToSchemas = new PathToSchemasMap();
// todo add handling for prefixItems
int i = 0;
for(Object itemValue: (List<?>) arg) {
int minIndex = schema.prefixItems != null ? schema.prefixItems.size() : 0;
JsonSchema itemsSchema = JsonSchemaFactory.getInstance(items);
for(int i = minIndex; i < listArg.size(); i++) {
List<Object> itemPathToItem = new ArrayList<>(validationMetadata.pathToItem());
itemPathToItem.add(i);
ValidationMetadata itemValidationMetadata = new ValidationMetadata(
Expand All @@ -35,15 +38,12 @@ public ItemsValidator(Class<? extends JsonSchema> items) {
validationMetadata.validatedPathToSchemas(),
validationMetadata.seenClasses()
);
JsonSchema itemsSchema = JsonSchemaFactory.getInstance(items);
if (itemValidationMetadata.validationRanEarlier(itemsSchema)) {
// todo add_deeper_validated_schemas
i +=1;
continue;
}
PathToSchemasMap otherPathToSchemas = JsonSchema.validate(itemsSchema, itemValue, itemValidationMetadata);
PathToSchemasMap otherPathToSchemas = JsonSchema.validate(itemsSchema, listArg.get(i), itemValidationMetadata);
pathToSchemas.update(otherPathToSchemas);
i += 1;
}
return pathToSchemas;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@ public abstract class JsonSchema {
public @Nullable Map<String, Set<String>> dependentRequired;
public final @Nullable Map<String, Class<? extends JsonSchema>> dependentSchemas;
public @Nullable Map<Pattern, Class<? extends JsonSchema>> patternProperties;
public @Nullable List<Class<? extends JsonSchema>> prefixItems;
private final LinkedHashMap<String, KeywordValidator> keywordToValidator;

protected JsonSchema(JsonSchemaInfo jsonSchemaInfo) {
Expand Down Expand Up @@ -284,6 +285,13 @@ protected JsonSchema(JsonSchemaInfo jsonSchemaInfo) {
new PatternPropertiesValidator(this.patternProperties)
);
}
this.prefixItems = jsonSchemaInfo.prefixItems;
if (this.prefixItems != null) {
keywordToValidator.put(
"prefixItems",
new PrefixItemsValidator(this.prefixItems)
);
}
this.keywordToValidator = keywordToValidator;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -177,4 +177,9 @@ public JsonSchemaInfo patternProperties(Map<Pattern, Class<? extends JsonSchema>
this.patternProperties = patternProperties;
return this;
}
public @Nullable List<Class<? extends JsonSchema>> prefixItems = null;
public JsonSchemaInfo prefixItems(List<Class<? extends JsonSchema>> prefixItems) {
this.prefixItems = prefixItems;
return this;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
package org.openapijsonschematools.client.schemas.validation;

import org.checkerframework.checker.nullness.qual.Nullable;

import java.util.ArrayList;
import java.util.List;

public class PrefixItemsValidator implements KeywordValidator {
public final List<Class<? extends JsonSchema>> prefixItems;

public PrefixItemsValidator(List<Class<? extends JsonSchema>> prefixItems) {
this.prefixItems = prefixItems;
}

@Override
public @Nullable PathToSchemasMap validate(
JsonSchema schema,
@Nullable Object arg,
ValidationMetadata validationMetadata,
@Nullable List<PathToSchemasMap> containsPathToSchemas,
@Nullable PathToSchemasMap patternPropertiesPathToSchemas
) {
if (!(arg instanceof List<?> listArg)) {
return null;
}
if (listArg.isEmpty()) {
return null;
}
PathToSchemasMap pathToSchemas = new PathToSchemasMap();
int maxIndex = Math.min(listArg.size(), prefixItems.size());
for (int i=0; i < maxIndex; i++) {
List<Object> itemPathToItem = new ArrayList<>(validationMetadata.pathToItem());
itemPathToItem.add(i);
ValidationMetadata itemValidationMetadata = new ValidationMetadata(
itemPathToItem,
validationMetadata.configuration(),
validationMetadata.validatedPathToSchemas(),
validationMetadata.seenClasses()
);
JsonSchema itemsSchema = JsonSchemaFactory.getInstance(prefixItems.get(i));
PathToSchemasMap otherPathToSchemas = JsonSchema.validate(itemsSchema, listArg.get(i), itemValidationMetadata);
pathToSchemas.update(otherPathToSchemas);
}
return pathToSchemas;
}
}
15 changes: 15 additions & 0 deletions samples/client/3_1_0_unit_test/java/.openapi-generator/FILES
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
README.md
docs/components/schemas/ASchemaGivenForPrefixitems.md
docs/components/schemas/AdditionalItemsAreAllowedByDefault.md
docs/components/schemas/AdditionalpropertiesAreAllowedByDefault.md
docs/components/schemas/AdditionalpropertiesCanExistByItself.md
docs/components/schemas/AdditionalpropertiesDoesNotLookInApplicators.md
Expand Down Expand Up @@ -51,6 +53,7 @@ docs/components/schemas/Ipv6Format.md
docs/components/schemas/IriFormat.md
docs/components/schemas/IriReferenceFormat.md
docs/components/schemas/ItemsContains.md
docs/components/schemas/ItemsDoesNotLookInApplicatorsValidCase.md
docs/components/schemas/ItemsWithNullInstanceElements.md
docs/components/schemas/JsonPointerFormat.md
docs/components/schemas/MaxcontainsWithoutContainsIsIgnored.md
Expand Down Expand Up @@ -90,6 +93,8 @@ docs/components/schemas/PatternIsNotAnchored.md
docs/components/schemas/PatternValidation.md
docs/components/schemas/PatternpropertiesValidatesPropertiesMatchingARegex.md
docs/components/schemas/PatternpropertiesWithNullValuedInstanceProperties.md
docs/components/schemas/PrefixitemsValidationAdjustsTheStartingIndexForItems.md
docs/components/schemas/PrefixitemsWithNullInstanceElements.md
docs/components/schemas/PropertiesPatternpropertiesAdditionalpropertiesInteraction.md
docs/components/schemas/PropertiesWhoseNamesAreJavascriptObjectPropertyNames.md
docs/components/schemas/PropertiesWithEscapedCharacters.md
Expand All @@ -116,13 +121,17 @@ docs/components/schemas/UnevaluateditemsWithItems.md
docs/components/schemas/UnevaluatedpropertiesWithAdjacentAdditionalproperties.md
docs/components/schemas/UnevaluatedpropertiesWithNullValuedInstanceProperties.md
docs/components/schemas/UniqueitemsFalseValidation.md
docs/components/schemas/UniqueitemsFalseWithAnArrayOfItems.md
docs/components/schemas/UniqueitemsValidation.md
docs/components/schemas/UniqueitemsWithAnArrayOfItems.md
docs/components/schemas/UriFormat.md
docs/components/schemas/UriReferenceFormat.md
docs/components/schemas/UriTemplateFormat.md
docs/components/schemas/UuidFormat.md
docs/servers/Server0.md
pom.xml
src/main/java/org/openapijsonschematools/client/components/schemas/ASchemaGivenForPrefixitems.java
src/main/java/org/openapijsonschematools/client/components/schemas/AdditionalItemsAreAllowedByDefault.java
src/main/java/org/openapijsonschematools/client/components/schemas/AdditionalpropertiesAreAllowedByDefault.java
src/main/java/org/openapijsonschematools/client/components/schemas/AdditionalpropertiesCanExistByItself.java
src/main/java/org/openapijsonschematools/client/components/schemas/AdditionalpropertiesDoesNotLookInApplicators.java
Expand Down Expand Up @@ -175,6 +184,7 @@ src/main/java/org/openapijsonschematools/client/components/schemas/Ipv6Format.ja
src/main/java/org/openapijsonschematools/client/components/schemas/IriFormat.java
src/main/java/org/openapijsonschematools/client/components/schemas/IriReferenceFormat.java
src/main/java/org/openapijsonschematools/client/components/schemas/ItemsContains.java
src/main/java/org/openapijsonschematools/client/components/schemas/ItemsDoesNotLookInApplicatorsValidCase.java
src/main/java/org/openapijsonschematools/client/components/schemas/ItemsWithNullInstanceElements.java
src/main/java/org/openapijsonschematools/client/components/schemas/JsonPointerFormat.java
src/main/java/org/openapijsonschematools/client/components/schemas/MaxcontainsWithoutContainsIsIgnored.java
Expand Down Expand Up @@ -214,6 +224,8 @@ src/main/java/org/openapijsonschematools/client/components/schemas/PatternIsNotA
src/main/java/org/openapijsonschematools/client/components/schemas/PatternValidation.java
src/main/java/org/openapijsonschematools/client/components/schemas/PatternpropertiesValidatesPropertiesMatchingARegex.java
src/main/java/org/openapijsonschematools/client/components/schemas/PatternpropertiesWithNullValuedInstanceProperties.java
src/main/java/org/openapijsonschematools/client/components/schemas/PrefixitemsValidationAdjustsTheStartingIndexForItems.java
src/main/java/org/openapijsonschematools/client/components/schemas/PrefixitemsWithNullInstanceElements.java
src/main/java/org/openapijsonschematools/client/components/schemas/PropertiesPatternpropertiesAdditionalpropertiesInteraction.java
src/main/java/org/openapijsonschematools/client/components/schemas/PropertiesWhoseNamesAreJavascriptObjectPropertyNames.java
src/main/java/org/openapijsonschematools/client/components/schemas/PropertiesWithEscapedCharacters.java
Expand All @@ -240,7 +252,9 @@ src/main/java/org/openapijsonschematools/client/components/schemas/Unevaluatedit
src/main/java/org/openapijsonschematools/client/components/schemas/UnevaluatedpropertiesWithAdjacentAdditionalproperties.java
src/main/java/org/openapijsonschematools/client/components/schemas/UnevaluatedpropertiesWithNullValuedInstanceProperties.java
src/main/java/org/openapijsonschematools/client/components/schemas/UniqueitemsFalseValidation.java
src/main/java/org/openapijsonschematools/client/components/schemas/UniqueitemsFalseWithAnArrayOfItems.java
src/main/java/org/openapijsonschematools/client/components/schemas/UniqueitemsValidation.java
src/main/java/org/openapijsonschematools/client/components/schemas/UniqueitemsWithAnArrayOfItems.java
src/main/java/org/openapijsonschematools/client/components/schemas/UriFormat.java
src/main/java/org/openapijsonschematools/client/components/schemas/UriReferenceFormat.java
src/main/java/org/openapijsonschematools/client/components/schemas/UriTemplateFormat.java
Expand Down Expand Up @@ -329,6 +343,7 @@ src/main/java/org/openapijsonschematools/client/schemas/validation/OneOfValidato
src/main/java/org/openapijsonschematools/client/schemas/validation/PathToSchemasMap.java
src/main/java/org/openapijsonschematools/client/schemas/validation/PatternPropertiesValidator.java
src/main/java/org/openapijsonschematools/client/schemas/validation/PatternValidator.java
src/main/java/org/openapijsonschematools/client/schemas/validation/PrefixItemsValidator.java
src/main/java/org/openapijsonschematools/client/schemas/validation/PropertiesValidator.java
src/main/java/org/openapijsonschematools/client/schemas/validation/PropertyEntry.java
src/main/java/org/openapijsonschematools/client/schemas/validation/PropertyNamesValidator.java
Expand Down
7 changes: 7 additions & 0 deletions samples/client/3_1_0_unit_test/java/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -157,6 +157,8 @@ allowed input and output types.

| Class | Description |
| ----- | ----------- |
| [ASchemaGivenForPrefixitems.ASchemaGivenForPrefixitems1](docs/components/schemas/ASchemaGivenForPrefixitems.md#aschemagivenforprefixitems1) | |
| [AdditionalItemsAreAllowedByDefault.AdditionalItemsAreAllowedByDefault1](docs/components/schemas/AdditionalItemsAreAllowedByDefault.md#additionalitemsareallowedbydefault1) | |
| [AdditionalpropertiesAreAllowedByDefault.AdditionalpropertiesAreAllowedByDefault1](docs/components/schemas/AdditionalpropertiesAreAllowedByDefault.md#additionalpropertiesareallowedbydefault1) | |
| [AdditionalpropertiesCanExistByItself.AdditionalpropertiesCanExistByItself1](docs/components/schemas/AdditionalpropertiesCanExistByItself.md#additionalpropertiescanexistbyitself1) | |
| [AdditionalpropertiesDoesNotLookInApplicators.AdditionalpropertiesDoesNotLookInApplicators1](docs/components/schemas/AdditionalpropertiesDoesNotLookInApplicators.md#additionalpropertiesdoesnotlookinapplicators1) | |
Expand Down Expand Up @@ -209,6 +211,7 @@ allowed input and output types.
| [IriFormat.IriFormat1](docs/components/schemas/IriFormat.md#iriformat1) | |
| [IriReferenceFormat.IriReferenceFormat1](docs/components/schemas/IriReferenceFormat.md#irireferenceformat1) | |
| [ItemsContains.ItemsContains1](docs/components/schemas/ItemsContains.md#itemscontains1) | |
| [ItemsDoesNotLookInApplicatorsValidCase.ItemsDoesNotLookInApplicatorsValidCase1](docs/components/schemas/ItemsDoesNotLookInApplicatorsValidCase.md#itemsdoesnotlookinapplicatorsvalidcase1) | |
| [ItemsWithNullInstanceElements.ItemsWithNullInstanceElements1](docs/components/schemas/ItemsWithNullInstanceElements.md#itemswithnullinstanceelements1) | |
| [JsonPointerFormat.JsonPointerFormat1](docs/components/schemas/JsonPointerFormat.md#jsonpointerformat1) | |
| [MaxcontainsWithoutContainsIsIgnored.MaxcontainsWithoutContainsIsIgnored1](docs/components/schemas/MaxcontainsWithoutContainsIsIgnored.md#maxcontainswithoutcontainsisignored1) | |
Expand Down Expand Up @@ -248,6 +251,8 @@ allowed input and output types.
| [PatternValidation.PatternValidation1](docs/components/schemas/PatternValidation.md#patternvalidation1) | |
| [PatternpropertiesValidatesPropertiesMatchingARegex.PatternpropertiesValidatesPropertiesMatchingARegex1](docs/components/schemas/PatternpropertiesValidatesPropertiesMatchingARegex.md#patternpropertiesvalidatespropertiesmatchingaregex1) | |
| [PatternpropertiesWithNullValuedInstanceProperties.PatternpropertiesWithNullValuedInstanceProperties1](docs/components/schemas/PatternpropertiesWithNullValuedInstanceProperties.md#patternpropertieswithnullvaluedinstanceproperties1) | |
| [PrefixitemsValidationAdjustsTheStartingIndexForItems.PrefixitemsValidationAdjustsTheStartingIndexForItems1](docs/components/schemas/PrefixitemsValidationAdjustsTheStartingIndexForItems.md#prefixitemsvalidationadjuststhestartingindexforitems1) | |
| [PrefixitemsWithNullInstanceElements.PrefixitemsWithNullInstanceElements1](docs/components/schemas/PrefixitemsWithNullInstanceElements.md#prefixitemswithnullinstanceelements1) | |
| [PropertiesPatternpropertiesAdditionalpropertiesInteraction.PropertiesPatternpropertiesAdditionalpropertiesInteraction1](docs/components/schemas/PropertiesPatternpropertiesAdditionalpropertiesInteraction.md#propertiespatternpropertiesadditionalpropertiesinteraction1) | |
| [PropertiesWhoseNamesAreJavascriptObjectPropertyNames.PropertiesWhoseNamesAreJavascriptObjectPropertyNames1](docs/components/schemas/PropertiesWhoseNamesAreJavascriptObjectPropertyNames.md#propertieswhosenamesarejavascriptobjectpropertynames1) | |
| [PropertiesWithEscapedCharacters.PropertiesWithEscapedCharacters1](docs/components/schemas/PropertiesWithEscapedCharacters.md#propertieswithescapedcharacters1) | |
Expand All @@ -274,7 +279,9 @@ allowed input and output types.
| [UnevaluatedpropertiesWithAdjacentAdditionalproperties.UnevaluatedpropertiesWithAdjacentAdditionalproperties1](docs/components/schemas/UnevaluatedpropertiesWithAdjacentAdditionalproperties.md#unevaluatedpropertieswithadjacentadditionalproperties1) | |
| [UnevaluatedpropertiesWithNullValuedInstanceProperties.UnevaluatedpropertiesWithNullValuedInstanceProperties1](docs/components/schemas/UnevaluatedpropertiesWithNullValuedInstanceProperties.md#unevaluatedpropertieswithnullvaluedinstanceproperties1) | |
| [UniqueitemsFalseValidation.UniqueitemsFalseValidation1](docs/components/schemas/UniqueitemsFalseValidation.md#uniqueitemsfalsevalidation1) | |
| [UniqueitemsFalseWithAnArrayOfItems.UniqueitemsFalseWithAnArrayOfItems1](docs/components/schemas/UniqueitemsFalseWithAnArrayOfItems.md#uniqueitemsfalsewithanarrayofitems1) | |
| [UniqueitemsValidation.UniqueitemsValidation1](docs/components/schemas/UniqueitemsValidation.md#uniqueitemsvalidation1) | |
| [UniqueitemsWithAnArrayOfItems.UniqueitemsWithAnArrayOfItems1](docs/components/schemas/UniqueitemsWithAnArrayOfItems.md#uniqueitemswithanarrayofitems1) | |
| [UriFormat.UriFormat1](docs/components/schemas/UriFormat.md#uriformat1) | |
| [UriReferenceFormat.UriReferenceFormat1](docs/components/schemas/UriReferenceFormat.md#urireferenceformat1) | |
| [UriTemplateFormat.UriTemplateFormat1](docs/components/schemas/UriTemplateFormat.md#uritemplateformat1) | |
Expand Down
Loading

0 comments on commit 8d47fb2

Please sign in to comment.