From 58950147a7b1df2475b320b32be497796f6be38f Mon Sep 17 00:00:00 2001 From: Martin Hauner Date: Sat, 2 Aug 2025 15:02:23 +0200 Subject: [PATCH 01/11] new helper to reduce duplication --- .../openapiprocessor/jsonschema/support/Types.java | 12 ++++++++++++ .../openapiprocessor/jsonschema/support/TypesSpec.kt | 6 ++++++ 2 files changed, 18 insertions(+) diff --git a/json-schema-validator/src/main/java/io/openapiprocessor/jsonschema/support/Types.java b/json-schema-validator/src/main/java/io/openapiprocessor/jsonschema/support/Types.java index 59c9d38c..91543600 100644 --- a/json-schema-validator/src/main/java/io/openapiprocessor/jsonschema/support/Types.java +++ b/json-schema-validator/src/main/java/io/openapiprocessor/jsonschema/support/Types.java @@ -65,6 +65,18 @@ public static Collection convertCollection (String path, @Nullable Objec return (Map) o; } + /** + * Returns {@code o} as {@code @Nullable Map} or null if it not a map. + * @param o the potential map + * @return the map or null if {@code o} is not a map + */ + public static @Nullable Map asObjectOrNull(@PolyNull Object o) { + if (!isObject(o)) + return null; + + return asObject(o); + } + @SuppressWarnings ("unchecked") public static @PolyNull Collection<@Nullable T> asCol (@PolyNull Object o) { return (Collection<@Nullable T>) o; diff --git a/json-schema-validator/src/test/kotlin/io/openapiprocessor/jsonschema/support/TypesSpec.kt b/json-schema-validator/src/test/kotlin/io/openapiprocessor/jsonschema/support/TypesSpec.kt index 434b38f1..b8ef046d 100644 --- a/json-schema-validator/src/test/kotlin/io/openapiprocessor/jsonschema/support/TypesSpec.kt +++ b/json-schema-validator/src/test/kotlin/io/openapiprocessor/jsonschema/support/TypesSpec.kt @@ -31,4 +31,10 @@ class TypesSpec: StringSpec({ "casts object to object" { asObject(emptyMap() as Any).shouldNotBeNull() } + + "check and cast to object" { + asObjectOrNull(null).shouldBeNull() + asObjectOrNull(emptyList()).shouldBeNull() + asObjectOrNull(emptyMap()).shouldNotBeNull() + } }) From 85596d20e3c1db1c0b82e256de7700a388471c23 Mon Sep 17 00:00:00 2001 From: Martin Hauner Date: Sat, 2 Aug 2025 15:17:33 +0200 Subject: [PATCH 02/11] extract for re-use --- .../jsonschema/schema/SchemaVersionUtil.java | 49 +++++++++++++++++++ .../jsonschema/schema/Scope.java | 23 +-------- 2 files changed, 50 insertions(+), 22 deletions(-) create mode 100644 json-schema-validator/src/main/java/io/openapiprocessor/jsonschema/schema/SchemaVersionUtil.java diff --git a/json-schema-validator/src/main/java/io/openapiprocessor/jsonschema/schema/SchemaVersionUtil.java b/json-schema-validator/src/main/java/io/openapiprocessor/jsonschema/schema/SchemaVersionUtil.java new file mode 100644 index 00000000..141659ae --- /dev/null +++ b/json-schema-validator/src/main/java/io/openapiprocessor/jsonschema/schema/SchemaVersionUtil.java @@ -0,0 +1,49 @@ +package io.openapiprocessor.jsonschema.schema; + +import io.openapiprocessor.jsonschema.support.Types; +import io.openapiprocessor.jsonschema.support.Uris; +import org.checkerframework.checker.nullness.qual.Nullable; + +import java.net.URI; +import java.util.Map; + +public class SchemaVersionUtil { + + /** + * Lookup the schema version. Checks the meta schema of the {@code document} first. If the version can not be + * determined from the meta schema it returns the {@code fallback} version. If there is no meta schema it checks + * the {@code documentUri}. If the version can not be determined from it, it returns the {@code fallback} version. + * + * @param documentUri the document URI + * @param document the document + * @param fallback th fallback version + * @return the schema version or if not available the fallback version + */ + public static SchemaVersion getSchemaVersion(URI documentUri, Object document, SchemaVersion fallback) { + URI metaSchema = getMetaSchema(document); + if (metaSchema != null) { + return SchemaVersion.getVersion(metaSchema, fallback); + } + + return SchemaVersion.getVersion(documentUri, fallback); + } + + /** + * Lookup the meta schema id. Returns the meta schema uri or null if there is no meta schema. + * + * @param document the document + * @return the meta schema uri or null if unavailable + */ + public static @Nullable URI getMetaSchema(Object document) { + Map object = Types.asObjectOrNull(document); + if (object == null) { + return null; + } + + Object schema = object.get(Keywords.SCHEMA); + if (!Types.isString(schema)) + return null; + + return Uris.createUri(Types.asString(schema)); + } +} diff --git a/json-schema-validator/src/main/java/io/openapiprocessor/jsonschema/schema/Scope.java b/json-schema-validator/src/main/java/io/openapiprocessor/jsonschema/schema/Scope.java index 7e162e3c..9e7cff5f 100644 --- a/json-schema-validator/src/main/java/io/openapiprocessor/jsonschema/schema/Scope.java +++ b/json-schema-validator/src/main/java/io/openapiprocessor/jsonschema/schema/Scope.java @@ -10,8 +10,8 @@ import org.checkerframework.checker.nullness.qual.Nullable; import java.net.URI; -import java.util.Map; +import static io.openapiprocessor.jsonschema.schema.SchemaVersionUtil.getSchemaVersion; import static io.openapiprocessor.jsonschema.support.Null.nonNull; @@ -145,25 +145,4 @@ public Scope move (Object document) { public String toString () { return String.format ("base: %s (%s) (doc: %s)", baseUri, version, documentUri); } - - private static SchemaVersion getSchemaVersion(URI documentUri, Object document, SchemaVersion fallback) { - URI metaSchema = getMetaSchema(document); - if (metaSchema != null) { - return SchemaVersion.getVersion(metaSchema, fallback); - } - - return SchemaVersion.getVersion(documentUri, fallback); - } - - private static @Nullable URI getMetaSchema(Object document) { - if (!Types.isObject(document)) - return null; - - Map object = Types.asObject(document); - Object schema = object.get(Keywords.SCHEMA); - if (!Types.isString(schema)) - return null; - - return Uris.createUri(Types.asString(schema)); - } } From d1e20246588995b866c1506fd9ae6c14d445976b Mon Sep 17 00:00:00 2001 From: Martin Hauner Date: Sat, 2 Aug 2025 15:18:03 +0200 Subject: [PATCH 03/11] fix visibility --- .../java/io/openapiprocessor/jsonschema/schema/Document.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/json-schema-validator/src/main/java/io/openapiprocessor/jsonschema/schema/Document.java b/json-schema-validator/src/main/java/io/openapiprocessor/jsonschema/schema/Document.java index 8fb4c2f5..ec74ab8b 100644 --- a/json-schema-validator/src/main/java/io/openapiprocessor/jsonschema/schema/Document.java +++ b/json-schema-validator/src/main/java/io/openapiprocessor/jsonschema/schema/Document.java @@ -5,8 +5,8 @@ package io.openapiprocessor.jsonschema.schema; -class Document { - enum Source { +public class Document { + public enum Source { ID, ANCHOR, DYNAMIC_ANCHOR } From f1e0fc9125d130ca7c930c1bc98322e6db586254 Mon Sep 17 00:00:00 2001 From: Martin Hauner Date: Sat, 2 Aug 2025 19:00:57 +0200 Subject: [PATCH 04/11] add base uri customizer for OpenAPI 3.2 --- .../jsonschema/schema/Resolver.java | 49 +++++++++++++++---- .../jsonschema/schema/Scope.java | 4 ++ .../jsonschema/schema/ResolverSpec.kt | 18 +++++++ 3 files changed, 62 insertions(+), 9 deletions(-) diff --git a/json-schema-validator/src/main/java/io/openapiprocessor/jsonschema/schema/Resolver.java b/json-schema-validator/src/main/java/io/openapiprocessor/jsonschema/schema/Resolver.java index abc8868d..d320198e 100644 --- a/json-schema-validator/src/main/java/io/openapiprocessor/jsonschema/schema/Resolver.java +++ b/json-schema-validator/src/main/java/io/openapiprocessor/jsonschema/schema/Resolver.java @@ -6,13 +6,15 @@ package io.openapiprocessor.jsonschema.schema; import io.openapiprocessor.jsonschema.support.Types; +import io.openapiprocessor.jsonschema.support.Uris; import org.checkerframework.checker.nullness.qual.Nullable; -import org.checkerframework.checker.nullness.qual.PolyNull; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.net.URI; +import static io.openapiprocessor.jsonschema.schema.SchemaVersionUtil.getSchemaVersion; + /** * loads the base document and resolves all internal and external $ref's. In case of an external * $ref it automatically downloads the referenced document if {@code autoLoadSchemas} is enabled. @@ -26,8 +28,9 @@ public class Resolver { private static final Logger log = LoggerFactory.getLogger (Resolver.class); public static class Settings { - private SchemaVersion version; + private final SchemaVersion version; private boolean autoLoadSchemas = false; + private @Nullable BaseUriCustomizer baseUriCustomizer; public Settings (SchemaVersion version) { this.version = version; @@ -38,11 +41,26 @@ public Settings autoLoadSchemas (boolean load) { return this; } + public Settings baseUriCustomizer(BaseUriCustomizer provider) { + this.baseUriCustomizer = provider; + return this; + } + public SchemaVersion getVersion () { return version; } } + public interface BaseUriCustomizer { + /** + * get a base uri from a document if available. + * + * @param document the document + * @return base uri or null + */ + @Nullable URI get (URI documentUri, Object document); + } + private final DocumentStore documents; private final DocumentLoader loader; @@ -95,9 +113,9 @@ public ResolverResult resolve (String resourcePath, Settings settings) { public ResolverResult resolve (URI documentUri, Object document, Settings settings) { ReferenceRegistry registry = new ReferenceRegistry (); - documents.addId (documentUri, document); - Scope scope = Scope.createScope (documentUri, document, settings.version); - Bucket bucket = toBucket (scope, document); + Scope scope = createScope(documentUri, document, settings); + documents.addId (scope.getBaseUri(), document); + Bucket bucket = Bucket.createBucket(scope, document); if (bucket == null) { return new ResolverResult (scope, document, registry, documents); @@ -114,10 +132,23 @@ public ResolverResult resolve (URI documentUri, Object document, Settings settin return new ResolverResult (scope, document, registry, documents); } - private @Nullable Bucket toBucket (Scope scope, @PolyNull Object source) { - if (!Types.isObject (source)) { - return null; + Scope createScope(URI documentUri, Object document, Settings settings) { + SchemaVersion version = getSchemaVersion(documentUri, document, settings.version); + + if (settings.baseUriCustomizer != null) { + @Nullable URI baseUri = settings.baseUriCustomizer.get(documentUri, document); + if (baseUri != null) { + return Scope.createScope(documentUri, Uris.resolve(documentUri, baseUri), version); + } } - return new Bucket (scope, Types.asObject (source)); + + if (Types.isObject(document)) { + String id = version.getIdProvider().getId(Types.asObject(document)); + if (id != null) { + return Scope.createScope(documentUri, Uris.resolve(documentUri, id), version); + } + } + + return Scope.createScope(documentUri, null, version); } } diff --git a/json-schema-validator/src/main/java/io/openapiprocessor/jsonschema/schema/Scope.java b/json-schema-validator/src/main/java/io/openapiprocessor/jsonschema/schema/Scope.java index 9e7cff5f..d0a57f5e 100644 --- a/json-schema-validator/src/main/java/io/openapiprocessor/jsonschema/schema/Scope.java +++ b/json-schema-validator/src/main/java/io/openapiprocessor/jsonschema/schema/Scope.java @@ -54,6 +54,10 @@ public static Scope createScope (URI documentUri, Object document, SchemaVersion return new Scope (documentUri, Uris.resolve(documentUri, id), version); } + public static Scope createScope (URI documentUri, @Nullable URI baseUri, SchemaVersion version) { + return new Scope (documentUri, baseUri, version); + } + /** * create the scope for the {@code document}. If {@code document} contains an id, it is the base uri, otherwise the * scope is the {@code documentUri}. If the {@code documentUri} matches a know json schema the result scope will use diff --git a/json-schema-validator/src/test/kotlin/io/openapiprocessor/jsonschema/schema/ResolverSpec.kt b/json-schema-validator/src/test/kotlin/io/openapiprocessor/jsonschema/schema/ResolverSpec.kt index 8800f971..5c7509e7 100644 --- a/json-schema-validator/src/test/kotlin/io/openapiprocessor/jsonschema/schema/ResolverSpec.kt +++ b/json-schema-validator/src/test/kotlin/io/openapiprocessor/jsonschema/schema/ResolverSpec.kt @@ -182,4 +182,22 @@ class ResolverSpec: StringSpec({ resolver.resolve(URI("memory:/instant.yaml"), settings) } } + + "baseUri customizer can change base uri" { + Memory.add("/schema.yaml", "${'$'}self: /base.yaml") + + val store = DocumentStore() + val loader = DocumentLoader(UriReader(), JacksonConverter()) + + val settings = Resolver.Settings (SchemaVersion.Draft4) + .baseUriCustomizer { documentUri, document -> + URI.create("/base.yaml") + } + + val resolver = Resolver(store, loader) + val result = resolver.resolve(URI("memory:/schema.yaml"), settings) + + result.scope.documentUri shouldBe URI("memory:/schema.yaml") + result.scope.baseUri shouldBe URI("memory:/base.yaml") + } }) From f1a54a3e2b285d63ecadef3243dc7eeaff9752af Mon Sep 17 00:00:00 2001 From: Martin Hauner Date: Tue, 19 Aug 2025 15:37:28 +0200 Subject: [PATCH 05/11] fix incomplete javadoc --- .../java/io/openapiprocessor/jsonschema/schema/Resolver.java | 1 + 1 file changed, 1 insertion(+) diff --git a/json-schema-validator/src/main/java/io/openapiprocessor/jsonschema/schema/Resolver.java b/json-schema-validator/src/main/java/io/openapiprocessor/jsonschema/schema/Resolver.java index d320198e..96f0c1e9 100644 --- a/json-schema-validator/src/main/java/io/openapiprocessor/jsonschema/schema/Resolver.java +++ b/json-schema-validator/src/main/java/io/openapiprocessor/jsonschema/schema/Resolver.java @@ -55,6 +55,7 @@ public interface BaseUriCustomizer { /** * get a base uri from a document if available. * + * @param documentUri document url * @param document the document * @return base uri or null */ From c2de44a9dcb03bb7d8242247e3eaa5f8b6d84578 Mon Sep 17 00:00:00 2001 From: Martin Hauner Date: Tue, 19 Aug 2025 15:58:48 +0200 Subject: [PATCH 06/11] extract schema detection, i.e. where can $ids be --- .../jsonschema/schema/ResolverId.java | 113 +++++++++++------- 1 file changed, 72 insertions(+), 41 deletions(-) diff --git a/json-schema-validator/src/main/java/io/openapiprocessor/jsonschema/schema/ResolverId.java b/json-schema-validator/src/main/java/io/openapiprocessor/jsonschema/schema/ResolverId.java index 9e559a36..94b5c1c9 100644 --- a/json-schema-validator/src/main/java/io/openapiprocessor/jsonschema/schema/ResolverId.java +++ b/json-schema-validator/src/main/java/io/openapiprocessor/jsonschema/schema/ResolverId.java @@ -19,35 +19,66 @@ public class ResolverId { private final ResolverContext context; + interface SchemaDetector { + boolean isSchema(); + boolean isSchemaArray(); + boolean isSchemaMap(); + } + + static class JsonSchemaDetector implements SchemaDetector { + private final @Nullable Keyword keyword; + + public JsonSchemaDetector(SchemaVersion version, String propertyName) { + this.keyword = version.getKeyword(propertyName); + } + + @Override + public boolean isSchema() { + return keyword != null && keyword.isNavigable() && keyword.isSchema(); + } + + @Override + public boolean isSchemaArray() { + return keyword != null && keyword.isNavigable() && keyword.isSchemaArray(); + } + + @Override + public boolean isSchemaMap() { + return keyword != null && keyword.isNavigable() && keyword.isSchemaMap(); + } + } + public ResolverId (ResolverContext context) { this.context = context; } public void resolve (Bucket bucket) { resolveId (bucket); - walkBucket (bucket); + walkBucket (bucket, true); } @SuppressWarnings({"dereference.of.nullable"}) - private void walkBucket (Bucket bucket) { - URI currentId = getId (bucket); - registerId (currentId, bucket); - resolveId (bucket); - - // since 2019-09 - URI currentAnchor = getAnchor (bucket); - registerAnchor (currentAnchor, bucket); - resolveAnchor (currentAnchor, bucket); - - // only 2019-09 - URI recursiveAnchor = getRecursiveAnchor (bucket); - registerDynamicAnchor (recursiveAnchor, bucket); - resolveDynamicAnchor (recursiveAnchor, bucket); - - // since 2020-12 - URI dynamicAnchor = getDynamicAnchor (bucket); - registerDynamicAnchor (dynamicAnchor, bucket); - resolveDynamicAnchor (dynamicAnchor, bucket); + private void walkBucket (Bucket bucket, boolean detectId) { + if (detectId) { + URI currentId = getId(bucket); + registerId(currentId, bucket); + resolveId(bucket); + + // since 2019-09 + URI currentAnchor = getAnchor(bucket); + registerAnchor(currentAnchor, bucket); + resolveAnchor(currentAnchor, bucket); + + // only 2019-09 + URI recursiveAnchor = getRecursiveAnchor(bucket); + registerDynamicAnchor(recursiveAnchor, bucket); + resolveDynamicAnchor(recursiveAnchor, bucket); + + // since 2020-12 + URI dynamicAnchor = getDynamicAnchor(bucket); + registerDynamicAnchor(dynamicAnchor, bucket); + resolveDynamicAnchor(dynamicAnchor, bucket); + } Scope scope = bucket.getScope (); JsonPointer location = bucket.getLocation (); @@ -55,53 +86,53 @@ private void walkBucket (Bucket bucket) { bucket.forEach ((name, value) -> { JsonPointer propLocation = location.append (name); - Keyword keyword = version.getKeyword (name); - boolean navigable = keyword != null && keyword.isNavigable (); + // we only want to detect $id's in schema objects + JsonSchemaDetector schemaDetector = new JsonSchemaDetector(version, name); - if (navigable && keyword.isSchema () && Types.isObject (value)) { - walkSchema (scope, value, propLocation); + if (schemaDetector.isSchema () && Types.isObject(value)) { + walkObject(scope, value, propLocation, true); - } else if (navigable && keyword.isSchemaArray () && Types.isArray (value)) { - walkSchemaArray (scope, value, propLocation); + } else if (schemaDetector.isSchemaArray () && Types.isArray(value)) { + walkArray(scope, value, propLocation, true); - } else if (navigable && keyword.isSchemaMap ()) { - walkSchemaMap (scope, value, propLocation); + } else if (schemaDetector.isSchemaMap() && Types.isObject(value)) { + walkMap(scope, value, propLocation, true); - } /* else if (keyword == null && isObject (value)) { - walkSchema (scope, value, propLocation); + } else if (Types.isObject (value)) { + walkObject(scope, value, propLocation, false); - } else if (keyword == null && isArray (value)) { - walkSchemaArray (scope, value, propLocation); - } */ + } else if (Types.isArray (value)) { + walkArray(scope, value, propLocation, false); + } }); } - private void walkSchema (Scope currentScope, Object value, JsonPointer location) { + private void walkObject (Scope currentScope, Object value, JsonPointer location, boolean detectId) { Scope scope = currentScope.move (value); Bucket bucket = Bucket.createBucket(scope, value, location); if (bucket == null) { return; // todo error } - walkBucket (bucket); + walkBucket (bucket, detectId); } - private void walkSchemaArray (Scope currentScope, Object value, JsonPointer location) { - Collection items = Types.asArray (value); + private void walkArray(Scope currentScope, Object value, JsonPointer location, boolean detectId) { + Collection items = Types.asArray(value); if (items == null) { return; // todo error } int index = 0; for (Object item : items) { - JsonPointer itemLocation = location.append (index); - walkSchema (currentScope, item, itemLocation); + JsonPointer itemLocation = location.append(index); + walkObject(currentScope, item, itemLocation, detectId); index++; } } - private void walkSchemaMap (Scope currentScope, @Nullable Object value, JsonPointer location) { + private void walkMap (Scope currentScope, @Nullable Object value, JsonPointer location, boolean detectId) { Scope targetScope = currentScope.move (requiresNonNull(value)); Bucket bucket = Bucket.createBucket(targetScope, value, location); if (bucket == null) { @@ -110,7 +141,7 @@ private void walkSchemaMap (Scope currentScope, @Nullable Object value, JsonPoin bucket.forEach ((propName, propValue) -> { JsonPointer propLocation = location.append (propName); - walkSchema (targetScope, requiresNonNull(propValue), propLocation); + walkObject (targetScope, requiresNonNull(propValue), propLocation, detectId); }); } From 121220399481d109e26d74425374540e5af9cf29 Mon Sep 17 00:00:00 2001 From: Martin Hauner Date: Fri, 5 Sep 2025 11:15:18 +0200 Subject: [PATCH 07/11] update doc links --- .../src/main/java/io/openapiparser/model/v30/Callback.java | 2 +- .../src/main/java/io/openapiparser/model/v30/Components.java | 2 +- .../src/main/java/io/openapiparser/model/v30/Contact.java | 2 +- .../src/main/java/io/openapiparser/model/v30/Discriminator.java | 2 +- .../src/main/java/io/openapiparser/model/v30/Encoding.java | 2 +- .../src/main/java/io/openapiparser/model/v30/Example.java | 2 +- .../src/main/java/io/openapiparser/model/v30/Extensions.java | 2 +- .../java/io/openapiparser/model/v30/ExternalDocumentation.java | 2 +- .../src/main/java/io/openapiparser/model/v30/Header.java | 2 +- .../src/main/java/io/openapiparser/model/v30/Info.java | 2 +- .../src/main/java/io/openapiparser/model/v30/License.java | 2 +- .../src/main/java/io/openapiparser/model/v30/Link.java | 2 +- .../src/main/java/io/openapiparser/model/v30/MediaType.java | 2 +- .../src/main/java/io/openapiparser/model/v30/OpenApi.java | 2 +- .../src/main/java/io/openapiparser/model/v30/Operation.java | 2 +- .../src/main/java/io/openapiparser/model/v30/Parameter.java | 2 +- .../src/main/java/io/openapiparser/model/v30/PathItem.java | 2 +- .../src/main/java/io/openapiparser/model/v30/Paths.java | 2 +- .../src/main/java/io/openapiparser/model/v30/Reference.java | 2 +- .../src/main/java/io/openapiparser/model/v30/RequestBody.java | 2 +- .../src/main/java/io/openapiparser/model/v30/Response.java | 2 +- .../src/main/java/io/openapiparser/model/v30/Responses.java | 2 +- .../src/main/java/io/openapiparser/model/v30/Schema.java | 2 +- .../java/io/openapiparser/model/v30/SecurityRequirement.java | 2 +- .../main/java/io/openapiparser/model/v30/SecurityScheme.java | 2 +- .../src/main/java/io/openapiparser/model/v30/Server.java | 2 +- .../main/java/io/openapiparser/model/v30/ServerVariable.java | 2 +- .../src/main/java/io/openapiparser/model/v30/Tag.java | 2 +- .../src/main/java/io/openapiparser/model/v30/Xml.java | 2 +- 29 files changed, 29 insertions(+), 29 deletions(-) diff --git a/openapi-parser/src/main/java/io/openapiparser/model/v30/Callback.java b/openapi-parser/src/main/java/io/openapiparser/model/v30/Callback.java index a8235f4a..e1281711 100644 --- a/openapi-parser/src/main/java/io/openapiparser/model/v30/Callback.java +++ b/openapi-parser/src/main/java/io/openapiparser/model/v30/Callback.java @@ -16,7 +16,7 @@ * the Callback object. * *

See specification: - * 4.7.18 Callback Object + * 4.7.18 Callback Object */ public class Callback extends Properties implements Extensions { diff --git a/openapi-parser/src/main/java/io/openapiparser/model/v30/Components.java b/openapi-parser/src/main/java/io/openapiparser/model/v30/Components.java index 6c519841..0ee3c72a 100644 --- a/openapi-parser/src/main/java/io/openapiparser/model/v30/Components.java +++ b/openapi-parser/src/main/java/io/openapiparser/model/v30/Components.java @@ -18,7 +18,7 @@ * the Components object. * *

See specification: - * 4.7.7 Components Object + * 4.7.7 Components Object */ public class Components extends Properties implements Extensions { diff --git a/openapi-parser/src/main/java/io/openapiparser/model/v30/Contact.java b/openapi-parser/src/main/java/io/openapiparser/model/v30/Contact.java index cb6bd0b5..29013ef3 100644 --- a/openapi-parser/src/main/java/io/openapiparser/model/v30/Contact.java +++ b/openapi-parser/src/main/java/io/openapiparser/model/v30/Contact.java @@ -18,7 +18,7 @@ * the Contact object. * *

See specification: - * 4.7.3 Contact Object + * 4.7.3 Contact Object */ public class Contact extends Properties implements Extensions { diff --git a/openapi-parser/src/main/java/io/openapiparser/model/v30/Discriminator.java b/openapi-parser/src/main/java/io/openapiparser/model/v30/Discriminator.java index 2ad17b1b..f64e109f 100644 --- a/openapi-parser/src/main/java/io/openapiparser/model/v30/Discriminator.java +++ b/openapi-parser/src/main/java/io/openapiparser/model/v30/Discriminator.java @@ -18,7 +18,7 @@ * the Discriminator object. * *

See specification: - * 4.7.25 Discriminator Object + * 4.7.25 Discriminator Object */ public class Discriminator extends Properties { diff --git a/openapi-parser/src/main/java/io/openapiparser/model/v30/Encoding.java b/openapi-parser/src/main/java/io/openapiparser/model/v30/Encoding.java index 29c519c4..bdc06bb2 100644 --- a/openapi-parser/src/main/java/io/openapiparser/model/v30/Encoding.java +++ b/openapi-parser/src/main/java/io/openapiparser/model/v30/Encoding.java @@ -18,7 +18,7 @@ * the Encoding object. * *

See specification: - * 4.7.15 Encoding Object + * 4.7.15 Encoding Object */ public class Encoding extends Properties implements Extensions { diff --git a/openapi-parser/src/main/java/io/openapiparser/model/v30/Example.java b/openapi-parser/src/main/java/io/openapiparser/model/v30/Example.java index 92355797..8e37d784 100644 --- a/openapi-parser/src/main/java/io/openapiparser/model/v30/Example.java +++ b/openapi-parser/src/main/java/io/openapiparser/model/v30/Example.java @@ -17,7 +17,7 @@ * the Example object. * *

See specification: - * 4.7.19 Example Object + * 4.7.19 Example Object */ public class Example extends Properties implements Reference, Extensions { diff --git a/openapi-parser/src/main/java/io/openapiparser/model/v30/Extensions.java b/openapi-parser/src/main/java/io/openapiparser/model/v30/Extensions.java index 91bfd745..826ec7d1 100644 --- a/openapi-parser/src/main/java/io/openapiparser/model/v30/Extensions.java +++ b/openapi-parser/src/main/java/io/openapiparser/model/v30/Extensions.java @@ -13,7 +13,7 @@ * the Specification Extensions object. * *

See specification: - * + * * 4.8 Specification Extensions * */ diff --git a/openapi-parser/src/main/java/io/openapiparser/model/v30/ExternalDocumentation.java b/openapi-parser/src/main/java/io/openapiparser/model/v30/ExternalDocumentation.java index e6ea1710..60757270 100644 --- a/openapi-parser/src/main/java/io/openapiparser/model/v30/ExternalDocumentation.java +++ b/openapi-parser/src/main/java/io/openapiparser/model/v30/ExternalDocumentation.java @@ -19,7 +19,7 @@ * the External Documentation object. * *

See specification: - * + * * 4.7.11 External Documentation Object * */ diff --git a/openapi-parser/src/main/java/io/openapiparser/model/v30/Header.java b/openapi-parser/src/main/java/io/openapiparser/model/v30/Header.java index 3aa002c4..8d501157 100644 --- a/openapi-parser/src/main/java/io/openapiparser/model/v30/Header.java +++ b/openapi-parser/src/main/java/io/openapiparser/model/v30/Header.java @@ -17,7 +17,7 @@ * the Header object. * *

See specification: - * 4.7.21 Header Object + * 4.7.21 Header Object */ public class Header extends Properties implements Reference, Extensions { diff --git a/openapi-parser/src/main/java/io/openapiparser/model/v30/Info.java b/openapi-parser/src/main/java/io/openapiparser/model/v30/Info.java index 4ce13dd7..643a8362 100644 --- a/openapi-parser/src/main/java/io/openapiparser/model/v30/Info.java +++ b/openapi-parser/src/main/java/io/openapiparser/model/v30/Info.java @@ -18,7 +18,7 @@ * the Info object. * *

See specification: - * 4.7.2 Info Object + * 4.7.2 Info Object */ public class Info extends Properties implements Extensions { diff --git a/openapi-parser/src/main/java/io/openapiparser/model/v30/License.java b/openapi-parser/src/main/java/io/openapiparser/model/v30/License.java index 34da7d10..1f1ed24a 100644 --- a/openapi-parser/src/main/java/io/openapiparser/model/v30/License.java +++ b/openapi-parser/src/main/java/io/openapiparser/model/v30/License.java @@ -19,7 +19,7 @@ * the License object. * *

See specification: - * 4.7.4 License Object + * 4.7.4 License Object */ public class License extends Properties implements Extensions { diff --git a/openapi-parser/src/main/java/io/openapiparser/model/v30/Link.java b/openapi-parser/src/main/java/io/openapiparser/model/v30/Link.java index e8f04bca..572ae210 100644 --- a/openapi-parser/src/main/java/io/openapiparser/model/v30/Link.java +++ b/openapi-parser/src/main/java/io/openapiparser/model/v30/Link.java @@ -16,7 +16,7 @@ * the Link object. * *

See specification: - * 4.7.20 Link Object + * 4.7.20 Link Object */ public class Link extends Properties implements Extensions { diff --git a/openapi-parser/src/main/java/io/openapiparser/model/v30/MediaType.java b/openapi-parser/src/main/java/io/openapiparser/model/v30/MediaType.java index dd52f84b..b8e80817 100644 --- a/openapi-parser/src/main/java/io/openapiparser/model/v30/MediaType.java +++ b/openapi-parser/src/main/java/io/openapiparser/model/v30/MediaType.java @@ -17,7 +17,7 @@ * the Media Type object. * *

See specification: - * 4.7.14 Media Type Object + * 4.7.14 Media Type Object */ public class MediaType extends Properties implements Extensions { diff --git a/openapi-parser/src/main/java/io/openapiparser/model/v30/OpenApi.java b/openapi-parser/src/main/java/io/openapiparser/model/v30/OpenApi.java index 4a0e593c..aa8e8654 100644 --- a/openapi-parser/src/main/java/io/openapiparser/model/v30/OpenApi.java +++ b/openapi-parser/src/main/java/io/openapiparser/model/v30/OpenApi.java @@ -19,7 +19,7 @@ * the OpenAPI object. * *

See specification: - * 4.7.1 OpenAPI Object + * 4.7.1 OpenAPI Object */ public class OpenApi extends Properties implements Extensions { diff --git a/openapi-parser/src/main/java/io/openapiparser/model/v30/Operation.java b/openapi-parser/src/main/java/io/openapiparser/model/v30/Operation.java index 2d8d142a..e397ca43 100644 --- a/openapi-parser/src/main/java/io/openapiparser/model/v30/Operation.java +++ b/openapi-parser/src/main/java/io/openapiparser/model/v30/Operation.java @@ -19,7 +19,7 @@ * the Operation object. * *

See specification: - * 4.7.10 Operation Object + * 4.7.10 Operation Object */ public class Operation extends Properties implements Extensions { diff --git a/openapi-parser/src/main/java/io/openapiparser/model/v30/Parameter.java b/openapi-parser/src/main/java/io/openapiparser/model/v30/Parameter.java index 62d902b7..b0c508b2 100644 --- a/openapi-parser/src/main/java/io/openapiparser/model/v30/Parameter.java +++ b/openapi-parser/src/main/java/io/openapiparser/model/v30/Parameter.java @@ -18,7 +18,7 @@ * the Parameter object. * *

See specification: - * 4.7.12 Parameter Object + * 4.7.12 Parameter Object */ public class Parameter extends Properties implements Reference, Extensions { diff --git a/openapi-parser/src/main/java/io/openapiparser/model/v30/PathItem.java b/openapi-parser/src/main/java/io/openapiparser/model/v30/PathItem.java index 79d05333..34329dfd 100644 --- a/openapi-parser/src/main/java/io/openapiparser/model/v30/PathItem.java +++ b/openapi-parser/src/main/java/io/openapiparser/model/v30/PathItem.java @@ -18,7 +18,7 @@ * the Path Item object. * *

See specification: - * 4.7.9 Path Item Object + * 4.7.9 Path Item Object */ public class PathItem extends Properties implements Reference, Extensions { diff --git a/openapi-parser/src/main/java/io/openapiparser/model/v30/Paths.java b/openapi-parser/src/main/java/io/openapiparser/model/v30/Paths.java index 94709e7b..7903bbca 100644 --- a/openapi-parser/src/main/java/io/openapiparser/model/v30/Paths.java +++ b/openapi-parser/src/main/java/io/openapiparser/model/v30/Paths.java @@ -16,7 +16,7 @@ * the Paths object. * *

See specification: - * 4.7.8 Paths Object + * 4.7.8 Paths Object */ public class Paths extends Properties implements Extensions { diff --git a/openapi-parser/src/main/java/io/openapiparser/model/v30/Reference.java b/openapi-parser/src/main/java/io/openapiparser/model/v30/Reference.java index 4c8b8ec6..61554da5 100644 --- a/openapi-parser/src/main/java/io/openapiparser/model/v30/Reference.java +++ b/openapi-parser/src/main/java/io/openapiparser/model/v30/Reference.java @@ -12,7 +12,7 @@ * the Reference object. * *

See specification: - * 4.7.23 Reference Object + * 4.7.23 Reference Object * JSON Reference */ public interface Reference { diff --git a/openapi-parser/src/main/java/io/openapiparser/model/v30/RequestBody.java b/openapi-parser/src/main/java/io/openapiparser/model/v30/RequestBody.java index cc86e88d..2e0b406e 100644 --- a/openapi-parser/src/main/java/io/openapiparser/model/v30/RequestBody.java +++ b/openapi-parser/src/main/java/io/openapiparser/model/v30/RequestBody.java @@ -17,7 +17,7 @@ * the Request Body object. * *

See specification: - * 4.7.13 Request Body Object + * 4.7.13 Request Body Object */ public class RequestBody extends Properties implements Reference, Extensions { diff --git a/openapi-parser/src/main/java/io/openapiparser/model/v30/Response.java b/openapi-parser/src/main/java/io/openapiparser/model/v30/Response.java index 14adcdf5..0b84675c 100644 --- a/openapi-parser/src/main/java/io/openapiparser/model/v30/Response.java +++ b/openapi-parser/src/main/java/io/openapiparser/model/v30/Response.java @@ -18,7 +18,7 @@ * the Response object. * *

See specification: - * 4.7.17 Response Object + * 4.7.17 Response Object */ public class Response extends Properties implements Reference, Extensions { diff --git a/openapi-parser/src/main/java/io/openapiparser/model/v30/Responses.java b/openapi-parser/src/main/java/io/openapiparser/model/v30/Responses.java index ef0e63ff..b0fca934 100644 --- a/openapi-parser/src/main/java/io/openapiparser/model/v30/Responses.java +++ b/openapi-parser/src/main/java/io/openapiparser/model/v30/Responses.java @@ -17,7 +17,7 @@ * the Responses object. * *

See specification: - * 4.7.16 Responses Object + * 4.7.16 Responses Object */ public class Responses extends Properties implements Extensions { diff --git a/openapi-parser/src/main/java/io/openapiparser/model/v30/Schema.java b/openapi-parser/src/main/java/io/openapiparser/model/v30/Schema.java index 653c4fe2..e0515389 100644 --- a/openapi-parser/src/main/java/io/openapiparser/model/v30/Schema.java +++ b/openapi-parser/src/main/java/io/openapiparser/model/v30/Schema.java @@ -19,7 +19,7 @@ * the Schema object. * *

See specification: - * 4.7.24 Schema Object + * 4.7.24 Schema Object * JSON Schema * JSON * Schema Validation diff --git a/openapi-parser/src/main/java/io/openapiparser/model/v30/SecurityRequirement.java b/openapi-parser/src/main/java/io/openapiparser/model/v30/SecurityRequirement.java index 479b7399..11ec35a0 100644 --- a/openapi-parser/src/main/java/io/openapiparser/model/v30/SecurityRequirement.java +++ b/openapi-parser/src/main/java/io/openapiparser/model/v30/SecurityRequirement.java @@ -12,7 +12,7 @@ * the Security Requirement object. * *

See specification: - * + * * 4.7.30 Security Requirement Object * */ diff --git a/openapi-parser/src/main/java/io/openapiparser/model/v30/SecurityScheme.java b/openapi-parser/src/main/java/io/openapiparser/model/v30/SecurityScheme.java index 2261da75..9ff3ea01 100644 --- a/openapi-parser/src/main/java/io/openapiparser/model/v30/SecurityScheme.java +++ b/openapi-parser/src/main/java/io/openapiparser/model/v30/SecurityScheme.java @@ -16,7 +16,7 @@ * the Security Scheme object. * *

See specification: - * + * * 4.7.28 Security Scheme Object * */ diff --git a/openapi-parser/src/main/java/io/openapiparser/model/v30/Server.java b/openapi-parser/src/main/java/io/openapiparser/model/v30/Server.java index 8c7bba5b..c7a84b25 100644 --- a/openapi-parser/src/main/java/io/openapiparser/model/v30/Server.java +++ b/openapi-parser/src/main/java/io/openapiparser/model/v30/Server.java @@ -18,7 +18,7 @@ * the Server object. * *

See specification: - * 4.7.5 Server Object + * 4.7.5 Server Object */ public class Server extends Properties implements Extensions { diff --git a/openapi-parser/src/main/java/io/openapiparser/model/v30/ServerVariable.java b/openapi-parser/src/main/java/io/openapiparser/model/v30/ServerVariable.java index 14acee70..fb8aabd4 100644 --- a/openapi-parser/src/main/java/io/openapiparser/model/v30/ServerVariable.java +++ b/openapi-parser/src/main/java/io/openapiparser/model/v30/ServerVariable.java @@ -19,7 +19,7 @@ * the Server Variable object. * *

See specification: - * 4.7.6 Server Variable Object + * 4.7.6 Server Variable Object */ public class ServerVariable extends Properties implements Extensions { diff --git a/openapi-parser/src/main/java/io/openapiparser/model/v30/Tag.java b/openapi-parser/src/main/java/io/openapiparser/model/v30/Tag.java index 3d85c4ec..1b4afa11 100644 --- a/openapi-parser/src/main/java/io/openapiparser/model/v30/Tag.java +++ b/openapi-parser/src/main/java/io/openapiparser/model/v30/Tag.java @@ -15,7 +15,7 @@ * the Tag object. * *

See specification: - * 4.7.22 Tag Object + * 4.7.22 Tag Object */ public class Tag extends Properties implements Extensions { diff --git a/openapi-parser/src/main/java/io/openapiparser/model/v30/Xml.java b/openapi-parser/src/main/java/io/openapiparser/model/v30/Xml.java index 9d89da13..83962215 100644 --- a/openapi-parser/src/main/java/io/openapiparser/model/v30/Xml.java +++ b/openapi-parser/src/main/java/io/openapiparser/model/v30/Xml.java @@ -15,7 +15,7 @@ * the XML object. * *

See specification: - * 4.7.26 XML Object + * 4.7.26 XML Object */ public class Xml extends Properties implements Extensions { From 02a219e65bc9c1fdad43b31bb4b0ab4f2359fe8b Mon Sep 17 00:00:00 2001 From: Martin Hauner Date: Fri, 5 Sep 2025 11:15:37 +0200 Subject: [PATCH 08/11] update doc links --- .../src/main/java/io/openapiparser/model/v31/Callback.java | 2 +- .../src/main/java/io/openapiparser/model/v31/Components.java | 2 +- .../src/main/java/io/openapiparser/model/v31/Contact.java | 2 +- .../src/main/java/io/openapiparser/model/v31/Discriminator.java | 2 +- .../src/main/java/io/openapiparser/model/v31/Encoding.java | 2 +- .../src/main/java/io/openapiparser/model/v31/Example.java | 2 +- .../src/main/java/io/openapiparser/model/v31/Extensions.java | 2 +- .../java/io/openapiparser/model/v31/ExternalDocumentation.java | 2 +- .../src/main/java/io/openapiparser/model/v31/Header.java | 2 +- .../src/main/java/io/openapiparser/model/v31/Info.java | 2 +- .../src/main/java/io/openapiparser/model/v31/License.java | 2 +- .../src/main/java/io/openapiparser/model/v31/Link.java | 2 +- .../src/main/java/io/openapiparser/model/v31/MediaType.java | 2 +- .../src/main/java/io/openapiparser/model/v31/OpenApi.java | 2 +- .../src/main/java/io/openapiparser/model/v31/Operation.java | 2 +- .../src/main/java/io/openapiparser/model/v31/Parameter.java | 2 +- .../src/main/java/io/openapiparser/model/v31/PathItem.java | 2 +- .../src/main/java/io/openapiparser/model/v31/Paths.java | 2 +- .../src/main/java/io/openapiparser/model/v31/Reference.java | 2 +- .../src/main/java/io/openapiparser/model/v31/RequestBody.java | 2 +- .../src/main/java/io/openapiparser/model/v31/Response.java | 2 +- .../src/main/java/io/openapiparser/model/v31/Responses.java | 2 +- .../src/main/java/io/openapiparser/model/v31/Schema.java | 2 +- .../java/io/openapiparser/model/v31/SecurityRequirement.java | 2 +- .../main/java/io/openapiparser/model/v31/SecurityScheme.java | 2 +- .../src/main/java/io/openapiparser/model/v31/Server.java | 2 +- .../main/java/io/openapiparser/model/v31/ServerVariable.java | 2 +- .../src/main/java/io/openapiparser/model/v31/Tag.java | 2 +- .../src/main/java/io/openapiparser/model/v31/Xml.java | 2 +- 29 files changed, 29 insertions(+), 29 deletions(-) diff --git a/openapi-parser/src/main/java/io/openapiparser/model/v31/Callback.java b/openapi-parser/src/main/java/io/openapiparser/model/v31/Callback.java index aa33f86d..b4207ae2 100644 --- a/openapi-parser/src/main/java/io/openapiparser/model/v31/Callback.java +++ b/openapi-parser/src/main/java/io/openapiparser/model/v31/Callback.java @@ -15,7 +15,7 @@ * the Callback object. * *

See specification: - * 4.8.18 Callback Object + * 4.8.18 Callback Object */ public class Callback extends Properties implements Extensions { diff --git a/openapi-parser/src/main/java/io/openapiparser/model/v31/Components.java b/openapi-parser/src/main/java/io/openapiparser/model/v31/Components.java index 71354a3d..45d49d16 100644 --- a/openapi-parser/src/main/java/io/openapiparser/model/v31/Components.java +++ b/openapi-parser/src/main/java/io/openapiparser/model/v31/Components.java @@ -18,7 +18,7 @@ * the Components object. * *

See specification: - * 4.8.7 Components Object + * 4.8.7 Components Object */ public class Components extends Properties implements Extensions { diff --git a/openapi-parser/src/main/java/io/openapiparser/model/v31/Contact.java b/openapi-parser/src/main/java/io/openapiparser/model/v31/Contact.java index 5dd35bee..382d33fe 100644 --- a/openapi-parser/src/main/java/io/openapiparser/model/v31/Contact.java +++ b/openapi-parser/src/main/java/io/openapiparser/model/v31/Contact.java @@ -18,7 +18,7 @@ * the Contact object. * *

See specification: - * 4.8.3 Contact Object + * 4.8.3 Contact Object */ public class Contact extends Properties implements Extensions { diff --git a/openapi-parser/src/main/java/io/openapiparser/model/v31/Discriminator.java b/openapi-parser/src/main/java/io/openapiparser/model/v31/Discriminator.java index 4bb11fed..ff766f03 100644 --- a/openapi-parser/src/main/java/io/openapiparser/model/v31/Discriminator.java +++ b/openapi-parser/src/main/java/io/openapiparser/model/v31/Discriminator.java @@ -19,7 +19,7 @@ * the Discriminator object. * *

See specification: - * 4.8.25 Discriminator Object + * 4.8.25 Discriminator Object */ public class Discriminator extends Properties implements Extensions { diff --git a/openapi-parser/src/main/java/io/openapiparser/model/v31/Encoding.java b/openapi-parser/src/main/java/io/openapiparser/model/v31/Encoding.java index 08142beb..2c9ec29f 100644 --- a/openapi-parser/src/main/java/io/openapiparser/model/v31/Encoding.java +++ b/openapi-parser/src/main/java/io/openapiparser/model/v31/Encoding.java @@ -17,7 +17,7 @@ * the Encoding object. * *

See specification: - * 4.8.15 Encoding Object + * 4.8.15 Encoding Object */ public class Encoding extends Properties implements Extensions { diff --git a/openapi-parser/src/main/java/io/openapiparser/model/v31/Example.java b/openapi-parser/src/main/java/io/openapiparser/model/v31/Example.java index 860ebc62..770a23c9 100644 --- a/openapi-parser/src/main/java/io/openapiparser/model/v31/Example.java +++ b/openapi-parser/src/main/java/io/openapiparser/model/v31/Example.java @@ -17,7 +17,7 @@ * the Example object. * *

See specification: - * 4.8.19 Example Object + * 4.8.19 Example Object */ public class Example extends Properties implements Reference, Extensions { diff --git a/openapi-parser/src/main/java/io/openapiparser/model/v31/Extensions.java b/openapi-parser/src/main/java/io/openapiparser/model/v31/Extensions.java index e6236974..89f99f1a 100644 --- a/openapi-parser/src/main/java/io/openapiparser/model/v31/Extensions.java +++ b/openapi-parser/src/main/java/io/openapiparser/model/v31/Extensions.java @@ -13,7 +13,7 @@ * the Specification Extensions object. * *

See specification: - * + * * 4.9 Specification Extensions * */ diff --git a/openapi-parser/src/main/java/io/openapiparser/model/v31/ExternalDocumentation.java b/openapi-parser/src/main/java/io/openapiparser/model/v31/ExternalDocumentation.java index d3e2a9cd..7fdf3b68 100644 --- a/openapi-parser/src/main/java/io/openapiparser/model/v31/ExternalDocumentation.java +++ b/openapi-parser/src/main/java/io/openapiparser/model/v31/ExternalDocumentation.java @@ -19,7 +19,7 @@ * the External Documentation object. * *

See specification: - * + * * 4.8.11 External Documentation Object * */ diff --git a/openapi-parser/src/main/java/io/openapiparser/model/v31/Header.java b/openapi-parser/src/main/java/io/openapiparser/model/v31/Header.java index c544bbd9..73f28442 100644 --- a/openapi-parser/src/main/java/io/openapiparser/model/v31/Header.java +++ b/openapi-parser/src/main/java/io/openapiparser/model/v31/Header.java @@ -17,7 +17,7 @@ * the Header object. * *

See specification: - * 4.8.21 Header Object + * 4.8.21 Header Object */ public class Header extends Properties implements Reference, Extensions { diff --git a/openapi-parser/src/main/java/io/openapiparser/model/v31/Info.java b/openapi-parser/src/main/java/io/openapiparser/model/v31/Info.java index 2e9309be..07a36aad 100644 --- a/openapi-parser/src/main/java/io/openapiparser/model/v31/Info.java +++ b/openapi-parser/src/main/java/io/openapiparser/model/v31/Info.java @@ -18,7 +18,7 @@ * the Info object. * *

See specification: - * 4.8.2 Info Object + * 4.8.2 Info Object */ public class Info extends Properties implements Extensions { diff --git a/openapi-parser/src/main/java/io/openapiparser/model/v31/License.java b/openapi-parser/src/main/java/io/openapiparser/model/v31/License.java index f55d069c..730fc2c2 100644 --- a/openapi-parser/src/main/java/io/openapiparser/model/v31/License.java +++ b/openapi-parser/src/main/java/io/openapiparser/model/v31/License.java @@ -18,7 +18,7 @@ * the License object. * *

See specification: - * 4.8.4 License Object + * 4.8.4 License Object */ public class License extends Properties implements Extensions { diff --git a/openapi-parser/src/main/java/io/openapiparser/model/v31/Link.java b/openapi-parser/src/main/java/io/openapiparser/model/v31/Link.java index cb82a00e..39b7c55b 100644 --- a/openapi-parser/src/main/java/io/openapiparser/model/v31/Link.java +++ b/openapi-parser/src/main/java/io/openapiparser/model/v31/Link.java @@ -16,7 +16,7 @@ * the Link object. * *

See specification: - * 4.8.20 Link Object + * 4.8.20 Link Object */ public class Link extends Properties implements Extensions { diff --git a/openapi-parser/src/main/java/io/openapiparser/model/v31/MediaType.java b/openapi-parser/src/main/java/io/openapiparser/model/v31/MediaType.java index 739a97e1..fe35f07e 100644 --- a/openapi-parser/src/main/java/io/openapiparser/model/v31/MediaType.java +++ b/openapi-parser/src/main/java/io/openapiparser/model/v31/MediaType.java @@ -17,7 +17,7 @@ * the Media Type object. * *

See specification: - * 4.8.14 Media Type Object + * 4.8.14 Media Type Object */ public class MediaType extends Properties implements Extensions { diff --git a/openapi-parser/src/main/java/io/openapiparser/model/v31/OpenApi.java b/openapi-parser/src/main/java/io/openapiparser/model/v31/OpenApi.java index 37f15575..00bc5ff4 100644 --- a/openapi-parser/src/main/java/io/openapiparser/model/v31/OpenApi.java +++ b/openapi-parser/src/main/java/io/openapiparser/model/v31/OpenApi.java @@ -19,7 +19,7 @@ * the OpenAPI object. * *

See specification: - * 4.7.1 OpenAPI Object + * 4.7.1 OpenAPI Object */ public class OpenApi extends Properties implements Extensions { diff --git a/openapi-parser/src/main/java/io/openapiparser/model/v31/Operation.java b/openapi-parser/src/main/java/io/openapiparser/model/v31/Operation.java index 966b6556..d8b236e6 100644 --- a/openapi-parser/src/main/java/io/openapiparser/model/v31/Operation.java +++ b/openapi-parser/src/main/java/io/openapiparser/model/v31/Operation.java @@ -18,7 +18,7 @@ * the Operation object. * *

See specification: - * 4.8.10 Operation Object + * 4.8.10 Operation Object */ public class Operation extends Properties implements Extensions { diff --git a/openapi-parser/src/main/java/io/openapiparser/model/v31/Parameter.java b/openapi-parser/src/main/java/io/openapiparser/model/v31/Parameter.java index e34ec995..4b2dd57a 100644 --- a/openapi-parser/src/main/java/io/openapiparser/model/v31/Parameter.java +++ b/openapi-parser/src/main/java/io/openapiparser/model/v31/Parameter.java @@ -18,7 +18,7 @@ * the Parameter object. * *

See specification: - * 4.8.12 Parameter Object + * 4.8.12 Parameter Object */ public class Parameter extends Properties implements Reference, Extensions { diff --git a/openapi-parser/src/main/java/io/openapiparser/model/v31/PathItem.java b/openapi-parser/src/main/java/io/openapiparser/model/v31/PathItem.java index ec6783f7..61d7cd05 100644 --- a/openapi-parser/src/main/java/io/openapiparser/model/v31/PathItem.java +++ b/openapi-parser/src/main/java/io/openapiparser/model/v31/PathItem.java @@ -18,7 +18,7 @@ * the Path Item object. * *

See specification: - * 4.8.9 Path Item Object + * 4.8.9 Path Item Object */ public class PathItem extends Properties implements Extensions, Reference { diff --git a/openapi-parser/src/main/java/io/openapiparser/model/v31/Paths.java b/openapi-parser/src/main/java/io/openapiparser/model/v31/Paths.java index 2f991770..92a8d8cb 100644 --- a/openapi-parser/src/main/java/io/openapiparser/model/v31/Paths.java +++ b/openapi-parser/src/main/java/io/openapiparser/model/v31/Paths.java @@ -16,7 +16,7 @@ * the Paths object. * *

See specification: - * 4.8.8 Paths Object + * 4.8.8 Paths Object */ public class Paths extends Properties implements Extensions { diff --git a/openapi-parser/src/main/java/io/openapiparser/model/v31/Reference.java b/openapi-parser/src/main/java/io/openapiparser/model/v31/Reference.java index 03d7972e..2129bf36 100644 --- a/openapi-parser/src/main/java/io/openapiparser/model/v31/Reference.java +++ b/openapi-parser/src/main/java/io/openapiparser/model/v31/Reference.java @@ -13,7 +13,7 @@ * the Reference object. * *

See specification: - * 4.8.23 Reference Object + * 4.8.23 Reference Object */ public interface Reference { diff --git a/openapi-parser/src/main/java/io/openapiparser/model/v31/RequestBody.java b/openapi-parser/src/main/java/io/openapiparser/model/v31/RequestBody.java index 708c8884..bf4e773d 100644 --- a/openapi-parser/src/main/java/io/openapiparser/model/v31/RequestBody.java +++ b/openapi-parser/src/main/java/io/openapiparser/model/v31/RequestBody.java @@ -17,7 +17,7 @@ * the Request Body object. * *

See specification: - * 4.8.13 Request Body Object + * 4.8.13 Request Body Object */ public class RequestBody extends Properties implements Reference, Extensions { diff --git a/openapi-parser/src/main/java/io/openapiparser/model/v31/Response.java b/openapi-parser/src/main/java/io/openapiparser/model/v31/Response.java index 6111936e..e502cd6a 100644 --- a/openapi-parser/src/main/java/io/openapiparser/model/v31/Response.java +++ b/openapi-parser/src/main/java/io/openapiparser/model/v31/Response.java @@ -18,7 +18,7 @@ * the Response object. * *

See specification: - * 4.8.16 Response Object + * 4.8.16 Response Object */ public class Response extends Properties implements Reference, Extensions { diff --git a/openapi-parser/src/main/java/io/openapiparser/model/v31/Responses.java b/openapi-parser/src/main/java/io/openapiparser/model/v31/Responses.java index b7c0872a..d4629105 100644 --- a/openapi-parser/src/main/java/io/openapiparser/model/v31/Responses.java +++ b/openapi-parser/src/main/java/io/openapiparser/model/v31/Responses.java @@ -17,7 +17,7 @@ * the Responses object. * *

See specification: - * 4.8.16 Responses Object + * 4.8.16 Responses Object */ public class Responses extends Properties implements Extensions { diff --git a/openapi-parser/src/main/java/io/openapiparser/model/v31/Schema.java b/openapi-parser/src/main/java/io/openapiparser/model/v31/Schema.java index 5d7b622b..7c56a80b 100644 --- a/openapi-parser/src/main/java/io/openapiparser/model/v31/Schema.java +++ b/openapi-parser/src/main/java/io/openapiparser/model/v31/Schema.java @@ -20,7 +20,7 @@ * the Schema object. * *

See specification: - * 4.8.24 Schema Object + * 4.8.24 Schema Object * JSON Schema * JSON Schema * Validation diff --git a/openapi-parser/src/main/java/io/openapiparser/model/v31/SecurityRequirement.java b/openapi-parser/src/main/java/io/openapiparser/model/v31/SecurityRequirement.java index 34df29e8..36c594eb 100644 --- a/openapi-parser/src/main/java/io/openapiparser/model/v31/SecurityRequirement.java +++ b/openapi-parser/src/main/java/io/openapiparser/model/v31/SecurityRequirement.java @@ -12,7 +12,7 @@ * the Security Requirement object. * *

See specification: - * + * * 4.8.30 Security Requirement Object * */ diff --git a/openapi-parser/src/main/java/io/openapiparser/model/v31/SecurityScheme.java b/openapi-parser/src/main/java/io/openapiparser/model/v31/SecurityScheme.java index 8ef04749..0abc9b90 100644 --- a/openapi-parser/src/main/java/io/openapiparser/model/v31/SecurityScheme.java +++ b/openapi-parser/src/main/java/io/openapiparser/model/v31/SecurityScheme.java @@ -16,7 +16,7 @@ * the Security Scheme object. * *

See specification: - * + * * 4.8.28 Security Scheme Object * */ diff --git a/openapi-parser/src/main/java/io/openapiparser/model/v31/Server.java b/openapi-parser/src/main/java/io/openapiparser/model/v31/Server.java index 66d1c663..39758adc 100644 --- a/openapi-parser/src/main/java/io/openapiparser/model/v31/Server.java +++ b/openapi-parser/src/main/java/io/openapiparser/model/v31/Server.java @@ -18,7 +18,7 @@ * the Server object. * *

See specification: - * 4.8.5 Server Object + * 4.8.5 Server Object */ public class Server extends Properties implements Extensions { diff --git a/openapi-parser/src/main/java/io/openapiparser/model/v31/ServerVariable.java b/openapi-parser/src/main/java/io/openapiparser/model/v31/ServerVariable.java index de3f78ce..885611e3 100644 --- a/openapi-parser/src/main/java/io/openapiparser/model/v31/ServerVariable.java +++ b/openapi-parser/src/main/java/io/openapiparser/model/v31/ServerVariable.java @@ -19,7 +19,7 @@ * the Server Variable object. * *

See specification: - * 4.8.6 Server Variable Object + * 4.8.6 Server Variable Object */ public class ServerVariable extends Properties implements Extensions { diff --git a/openapi-parser/src/main/java/io/openapiparser/model/v31/Tag.java b/openapi-parser/src/main/java/io/openapiparser/model/v31/Tag.java index b439e96f..20d10cfb 100644 --- a/openapi-parser/src/main/java/io/openapiparser/model/v31/Tag.java +++ b/openapi-parser/src/main/java/io/openapiparser/model/v31/Tag.java @@ -15,7 +15,7 @@ * the Tag object. * *

See specification: - * 4.8.22 Tag Object + * 4.8.22 Tag Object */ public class Tag extends Properties implements Extensions { diff --git a/openapi-parser/src/main/java/io/openapiparser/model/v31/Xml.java b/openapi-parser/src/main/java/io/openapiparser/model/v31/Xml.java index d8222912..e76d4967 100644 --- a/openapi-parser/src/main/java/io/openapiparser/model/v31/Xml.java +++ b/openapi-parser/src/main/java/io/openapiparser/model/v31/Xml.java @@ -15,7 +15,7 @@ * the XML object. * *

See specification: - * 4.8.26 XML Object + * 4.8.26 XML Object */ public class Xml extends Properties implements Extensions { From 8fe94c139845f95c25f9888a7c1b086049d99ae4 Mon Sep 17 00:00:00 2001 From: Martin Hauner Date: Fri, 5 Sep 2025 11:16:03 +0200 Subject: [PATCH 09/11] add 3.2 model --- .../io/openapiparser/model/v32/Callback.java | 39 ++ .../openapiparser/model/v32/Components.java | 73 +++ .../io/openapiparser/model/v32/Contact.java | 45 ++ .../model/v32/Discriminator.java | 44 ++ .../io/openapiparser/model/v32/Encoding.java | 64 +++ .../io/openapiparser/model/v32/Example.java | 63 +++ .../openapiparser/model/v32/Extensions.java | 30 ++ .../model/v32/ExternalDocumentation.java | 46 ++ .../io/openapiparser/model/v32/Header.java | 105 ++++ .../java/io/openapiparser/model/v32/Info.java | 64 +++ .../io/openapiparser/model/v32/License.java | 47 ++ .../java/io/openapiparser/model/v32/Link.java | 31 ++ .../io/openapiparser/model/v32/MediaType.java | 49 ++ .../io/openapiparser/model/v32/OpenApi.java | 84 +++ .../io/openapiparser/model/v32/Operation.java | 83 +++ .../io/openapiparser/model/v32/Parameter.java | 128 +++++ .../io/openapiparser/model/v32/PathItem.java | 118 +++++ .../io/openapiparser/model/v32/Paths.java | 41 ++ .../io/openapiparser/model/v32/Reference.java | 41 ++ .../openapiparser/model/v32/RequestBody.java | 66 +++ .../io/openapiparser/model/v32/Response.java | 73 +++ .../io/openapiparser/model/v32/Responses.java | 45 ++ .../io/openapiparser/model/v32/Schema.java | 486 ++++++++++++++++++ .../model/v32/SecurityRequirement.java | 25 + .../model/v32/SecurityScheme.java | 33 ++ .../io/openapiparser/model/v32/Server.java | 47 ++ .../model/v32/ServerVariable.java | 48 ++ .../java/io/openapiparser/model/v32/Tag.java | 31 ++ .../java/io/openapiparser/model/v32/Xml.java | 31 ++ 29 files changed, 2080 insertions(+) create mode 100644 openapi-parser/src/main/java/io/openapiparser/model/v32/Callback.java create mode 100644 openapi-parser/src/main/java/io/openapiparser/model/v32/Components.java create mode 100644 openapi-parser/src/main/java/io/openapiparser/model/v32/Contact.java create mode 100644 openapi-parser/src/main/java/io/openapiparser/model/v32/Discriminator.java create mode 100644 openapi-parser/src/main/java/io/openapiparser/model/v32/Encoding.java create mode 100644 openapi-parser/src/main/java/io/openapiparser/model/v32/Example.java create mode 100644 openapi-parser/src/main/java/io/openapiparser/model/v32/Extensions.java create mode 100644 openapi-parser/src/main/java/io/openapiparser/model/v32/ExternalDocumentation.java create mode 100644 openapi-parser/src/main/java/io/openapiparser/model/v32/Header.java create mode 100644 openapi-parser/src/main/java/io/openapiparser/model/v32/Info.java create mode 100644 openapi-parser/src/main/java/io/openapiparser/model/v32/License.java create mode 100644 openapi-parser/src/main/java/io/openapiparser/model/v32/Link.java create mode 100644 openapi-parser/src/main/java/io/openapiparser/model/v32/MediaType.java create mode 100644 openapi-parser/src/main/java/io/openapiparser/model/v32/OpenApi.java create mode 100644 openapi-parser/src/main/java/io/openapiparser/model/v32/Operation.java create mode 100644 openapi-parser/src/main/java/io/openapiparser/model/v32/Parameter.java create mode 100644 openapi-parser/src/main/java/io/openapiparser/model/v32/PathItem.java create mode 100644 openapi-parser/src/main/java/io/openapiparser/model/v32/Paths.java create mode 100644 openapi-parser/src/main/java/io/openapiparser/model/v32/Reference.java create mode 100644 openapi-parser/src/main/java/io/openapiparser/model/v32/RequestBody.java create mode 100644 openapi-parser/src/main/java/io/openapiparser/model/v32/Response.java create mode 100644 openapi-parser/src/main/java/io/openapiparser/model/v32/Responses.java create mode 100644 openapi-parser/src/main/java/io/openapiparser/model/v32/Schema.java create mode 100644 openapi-parser/src/main/java/io/openapiparser/model/v32/SecurityRequirement.java create mode 100644 openapi-parser/src/main/java/io/openapiparser/model/v32/SecurityScheme.java create mode 100644 openapi-parser/src/main/java/io/openapiparser/model/v32/Server.java create mode 100644 openapi-parser/src/main/java/io/openapiparser/model/v32/ServerVariable.java create mode 100644 openapi-parser/src/main/java/io/openapiparser/model/v32/Tag.java create mode 100644 openapi-parser/src/main/java/io/openapiparser/model/v32/Xml.java diff --git a/openapi-parser/src/main/java/io/openapiparser/model/v32/Callback.java b/openapi-parser/src/main/java/io/openapiparser/model/v32/Callback.java new file mode 100644 index 00000000..545fe540 --- /dev/null +++ b/openapi-parser/src/main/java/io/openapiparser/model/v32/Callback.java @@ -0,0 +1,39 @@ +/* + * Copyright 2025 https://github.com/openapi-processor/openapi-parser + * PDX-License-Identifier: Apache-2.0 + */ + +package io.openapiparser.model.v32; + +import io.openapiparser.Context; +import io.openapiparser.Properties; +import io.openapiprocessor.jsonschema.schema.Bucket; +import org.checkerframework.checker.nullness.qual.Nullable; + +import java.util.Map; + +/** + * the Callback object. + * + *

See specification: + * 4.8.18 Callback Object + */ +public class Callback extends Properties implements Extensions { + + public Callback (Context context, Bucket bucket) { + super (context, bucket); + } + + public Map getPathItems () { + return getMapObjectsOrEmpty (PathItem.class); + } + + public @Nullable PathItem getPathItem (String path) { + return getObjectOrNull (path, PathItem.class); + } + + @Override + public Map getExtensions () { + return super.getExtensions (); + } +} diff --git a/openapi-parser/src/main/java/io/openapiparser/model/v32/Components.java b/openapi-parser/src/main/java/io/openapiparser/model/v32/Components.java new file mode 100644 index 00000000..25bec0d3 --- /dev/null +++ b/openapi-parser/src/main/java/io/openapiparser/model/v32/Components.java @@ -0,0 +1,73 @@ +/* + * Copyright 2025 https://github.com/openapi-processor/openapi-parser + * PDX-License-Identifier: Apache-2.0 + */ + +package io.openapiparser.model.v32; + +import io.openapiparser.Context; +import io.openapiparser.Properties; +import io.openapiprocessor.jsonschema.schema.Bucket; +import org.checkerframework.checker.nullness.qual.Nullable; + +import java.util.Map; + +import static io.openapiparser.Keywords.*; + +/** + * the Components object. + * + *

See specification: + * 4.8.7 Components Object + */ +public class Components extends Properties implements Extensions { + + public Components (Context context, Bucket bucket) { + super (context, bucket); + } + + public Map getSchemas () { + return getMapObjectsOrEmpty (SCHEMAS, Schema.class); + } + + public Map getResponses () { + return getMapObjectsOrEmpty (RESPONSES, Response.class); + } + + public Map getParameters () { + return getMapObjectsOrEmpty (PARAMETERS, Parameter.class); + } + + public Map getExamples () { + return getMapObjectsOrEmpty (EXAMPLES, Example.class); + } + + public Map getRequestBodies () { + return getMapObjectsOrEmpty (REQUEST_BODIES, RequestBody.class); + } + + public Map getHeaders () { + return getMapObjectsOrEmpty (HEADERS, Header.class); + } + + public Map getSecuritySchemes () { + return getMapObjectsOrEmpty (SECURITY_SCHEMES, SecurityScheme.class); + } + + public Map getLinks () { + return getMapObjectsOrEmpty (LINKS, Link.class); + } + + public Map getCallbacks () { + return getMapObjectsOrEmpty (CALLBACKS, Callback.class); + } + + public Map getPathItems () { + return getMapObjectsOrEmpty (PATH_ITEMS, PathItem.class); + } + + @Override + public Map getExtensions () { + return super.getExtensions (); + } +} diff --git a/openapi-parser/src/main/java/io/openapiparser/model/v32/Contact.java b/openapi-parser/src/main/java/io/openapiparser/model/v32/Contact.java new file mode 100644 index 00000000..3f33b463 --- /dev/null +++ b/openapi-parser/src/main/java/io/openapiparser/model/v32/Contact.java @@ -0,0 +1,45 @@ +/* + * Copyright 2025 https://github.com/openapi-processor/openapi-parser + * PDX-License-Identifier: Apache-2.0 + */ + +package io.openapiparser.model.v32; + +import io.openapiparser.Context; +import io.openapiparser.Properties; +import io.openapiprocessor.jsonschema.schema.Bucket; +import org.checkerframework.checker.nullness.qual.Nullable; + +import java.util.Map; + +import static io.openapiparser.Keywords.*; + +/** + * the Contact object. + * + *

See specification: + * 4.8.3 Contact Object + */ +public class Contact extends Properties implements Extensions { + + public Contact (Context context, Bucket bucket) { + super (context, bucket); + } + + public @Nullable String getName () { + return getStringOrNull (NAME); + } + + public @Nullable String getUrl () { + return getStringOrNull (URL); + } + + public @Nullable String getEmail () { + return getStringOrNull (EMAIL); + } + + @Override + public Map getExtensions () { + return super.getExtensions (); + } +} diff --git a/openapi-parser/src/main/java/io/openapiparser/model/v32/Discriminator.java b/openapi-parser/src/main/java/io/openapiparser/model/v32/Discriminator.java new file mode 100644 index 00000000..48ead4f8 --- /dev/null +++ b/openapi-parser/src/main/java/io/openapiparser/model/v32/Discriminator.java @@ -0,0 +1,44 @@ +/* + * Copyright 2025 https://github.com/openapi-processor/openapi-parser + * PDX-License-Identifier: Apache-2.0 + */ + +package io.openapiparser.model.v32; + +import io.openapiparser.Context; +import io.openapiparser.Properties; +import io.openapiparser.support.Required; +import io.openapiprocessor.jsonschema.schema.Bucket; +import org.checkerframework.checker.nullness.qual.Nullable; + +import java.util.Map; + +import static io.openapiparser.Keywords.MAPPING; +import static io.openapiparser.Keywords.PROPERTY_NAME; + +/** + * the Discriminator object. + * + *

See specification: + * 4.8.25 Discriminator Object + */ +public class Discriminator extends Properties implements Extensions { + + public Discriminator (Context context, Bucket bucket) { + super (context, bucket); + } + + @Required + public String getPropertyName () { + return getStringOrThrow (PROPERTY_NAME); + } + + public Map getMapping () { + return getMapStringsOrEmpty (MAPPING); + } + + @Override + public Map getExtensions () { + return super.getExtensions (); + } +} diff --git a/openapi-parser/src/main/java/io/openapiparser/model/v32/Encoding.java b/openapi-parser/src/main/java/io/openapiparser/model/v32/Encoding.java new file mode 100644 index 00000000..af5bd50c --- /dev/null +++ b/openapi-parser/src/main/java/io/openapiparser/model/v32/Encoding.java @@ -0,0 +1,64 @@ +/* + * Copyright 2025 https://github.com/openapi-processor/openapi-parser + * PDX-License-Identifier: Apache-2.0 + */ + +package io.openapiparser.model.v32; + +import io.openapiparser.Context; +import io.openapiparser.Properties; +import io.openapiprocessor.jsonschema.schema.Bucket; +import org.checkerframework.checker.nullness.qual.Nullable; + +import java.util.Map; + +import static io.openapiparser.Keywords.*; + +/** + * the Encoding object. + * + *

See specification: + * 4.8.15 Encoding Object + */ +public class Encoding extends Properties implements Extensions { + + public Encoding (Context context, Bucket bucket) { + super (context, bucket); + } + + public @Nullable String getContentType () { + return getStringOrNull (CONTENT_TYPE); + } + + public Map getHeaders () { + return getMapObjectsOrEmpty (HEADERS, Header.class); + } + + public String getStyle () { + String style = getStringOrNull (STYLE); + if (style != null) { + return style; + } + + return "form"; + } + + public Boolean getExplode () { + Boolean explode = getBooleanOrNull (EXPLODE); + if (explode != null) { + return explode; + } + + final String style = getStyle (); + return "form".equals (style); + } + + public Boolean getAllowReserved () { + return getBooleanOrFalse (ALLOW_RESERVED); + } + + @Override + public Map getExtensions () { + return super.getExtensions (); + } +} diff --git a/openapi-parser/src/main/java/io/openapiparser/model/v32/Example.java b/openapi-parser/src/main/java/io/openapiparser/model/v32/Example.java new file mode 100644 index 00000000..1ce3b17d --- /dev/null +++ b/openapi-parser/src/main/java/io/openapiparser/model/v32/Example.java @@ -0,0 +1,63 @@ +/* + * Copyright 2025 https://github.com/openapi-processor/openapi-parser + * PDX-License-Identifier: Apache-2.0 + */ + +package io.openapiparser.model.v32; + +import io.openapiparser.Context; +import io.openapiparser.Properties; +import io.openapiprocessor.jsonschema.schema.Bucket; +import org.checkerframework.checker.nullness.qual.Nullable; + +import java.util.Map; + +import static io.openapiparser.Keywords.*; + +/** + * the Example object. + * + *

See specification: + * 4.8.19 Example Object + */ +public class Example extends Properties implements Reference, Extensions { + + public Example (Context context, Bucket bucket) { + super (context, bucket); + } + + /** {@inheritDoc} */ + @Override + public boolean isRef () { + return hasProperty (REF); + } + + /** {@inheritDoc} */ + @Override + public String getRef () { + return getStringOrThrow (REF); + } + + @Override + public @Nullable String getSummary () { + return getStringOrNull (SUMMARY); + } + + @Override + public @Nullable String getDescription () { + return getStringOrNull (DESCRIPTION); + } + + public @Nullable Object getValue () { + return getRawValue (VALUE); + } + + public @Nullable String getExternalValue () { + return getStringOrNull (EXTERNAL_VALUE); + } + + @Override + public Map getExtensions () { + return super.getExtensions (); + } +} diff --git a/openapi-parser/src/main/java/io/openapiparser/model/v32/Extensions.java b/openapi-parser/src/main/java/io/openapiparser/model/v32/Extensions.java new file mode 100644 index 00000000..c4326e79 --- /dev/null +++ b/openapi-parser/src/main/java/io/openapiparser/model/v32/Extensions.java @@ -0,0 +1,30 @@ +/* + * Copyright 2025 https://github.com/openapi-processor/openapi-parser + * PDX-License-Identifier: Apache-2.0 + */ + +package io.openapiparser.model.v32; + +import org.checkerframework.checker.nullness.qual.Nullable; + +import java.util.Map; + +/** + * the Specification Extensions object. + * + *

See specification: + * + * 4.9 Specification Extensions + * + */ +public interface Extensions { + + /** + * map of all extension properties. + * + * @return map of extension properties + */ + Map getExtensions (); + + // todo get specific extension +} diff --git a/openapi-parser/src/main/java/io/openapiparser/model/v32/ExternalDocumentation.java b/openapi-parser/src/main/java/io/openapiparser/model/v32/ExternalDocumentation.java new file mode 100644 index 00000000..00b5ef87 --- /dev/null +++ b/openapi-parser/src/main/java/io/openapiparser/model/v32/ExternalDocumentation.java @@ -0,0 +1,46 @@ +/* + * Copyright 2025 https://github.com/openapi-processor/openapi-parser + * PDX-License-Identifier: Apache-2.0 + */ + +package io.openapiparser.model.v32; + +import io.openapiparser.Context; +import io.openapiparser.Properties; +import io.openapiparser.support.Required; +import io.openapiprocessor.jsonschema.schema.Bucket; +import org.checkerframework.checker.nullness.qual.Nullable; + +import java.util.Map; + +import static io.openapiparser.Keywords.DESCRIPTION; +import static io.openapiparser.Keywords.URL; + +/** + * the External Documentation object. + * + *

See specification: + * + * 4.8.11 External Documentation Object + * + */ +public class ExternalDocumentation extends Properties implements Extensions { + + public ExternalDocumentation (Context context, Bucket bucket) { + super (context, bucket); + } + + public @Nullable String getDescription () { + return getStringOrNull (DESCRIPTION); + } + + @Required + public String getUrl () { + return getStringOrThrow (URL); + } + + @Override + public Map getExtensions () { + return super.getExtensions (); + } +} diff --git a/openapi-parser/src/main/java/io/openapiparser/model/v32/Header.java b/openapi-parser/src/main/java/io/openapiparser/model/v32/Header.java new file mode 100644 index 00000000..e52a064c --- /dev/null +++ b/openapi-parser/src/main/java/io/openapiparser/model/v32/Header.java @@ -0,0 +1,105 @@ +/* + * Copyright 2025 https://github.com/openapi-processor/openapi-parser + * PDX-License-Identifier: Apache-2.0 + */ + +package io.openapiparser.model.v32; + +import io.openapiparser.Context; +import io.openapiparser.Properties; +import io.openapiprocessor.jsonschema.schema.Bucket; +import org.checkerframework.checker.nullness.qual.Nullable; + +import java.util.Map; + +import static io.openapiparser.Keywords.*; + +/** + * the Header object. + * + *

See specification: + * 4.8.21 Header Object + */ +public class Header extends Properties implements Reference, Extensions { + + public Header (Context context, Bucket bucket) { + super (context, bucket); + } + + /** {@inheritDoc} */ + @Override + public boolean isRef () { + return hasProperty (REF); + } + + /** {@inheritDoc} */ + @Override + public String getRef () { + return getStringOrThrow (REF); + } + + @Override + public @Nullable String getSummary () { + return getStringOrNull (SUMMARY); + } + + @Override + public @Nullable String getDescription () { + return getStringOrNull (DESCRIPTION); + } + + public Boolean getRequired () { + return getBooleanOrFalse (REQUIRED); + } + + public Boolean getDeprecated () { + return getBooleanOrFalse (DEPRECATED); + } + + public Boolean getAllowEmptyValue () { + return getBooleanOrFalse (ALLOW_EMPTY_VALUE); + } + + public String getStyle () { + String style = getStringOrNull (STYLE); + if (style != null) { + return style; + } + + return "simple"; + } + + public Boolean getExplode () { + Boolean explode = getBooleanOrNull (EXPLODE); + if (explode != null) { + return explode; + } + + return false; + } + + public Boolean getAllowReserved () { + return getBooleanOrFalse (ALLOW_RESERVED); + } + + public @Nullable Schema getSchema () { + return getObjectOrNull (SCHEMA, Schema.class); + } + + public @Nullable Object getExample () { + return getRawValue (EXAMPLE); + } + + public Map getExamples () { + return getMapObjectsOrEmpty (EXAMPLES, Example.class); + } + + public Map getContent () { + return getMapObjectsOrEmpty (CONTENT, MediaType.class); + } + + @Override + public Map getExtensions () { + return super.getExtensions (); + } +} diff --git a/openapi-parser/src/main/java/io/openapiparser/model/v32/Info.java b/openapi-parser/src/main/java/io/openapiparser/model/v32/Info.java new file mode 100644 index 00000000..67064009 --- /dev/null +++ b/openapi-parser/src/main/java/io/openapiparser/model/v32/Info.java @@ -0,0 +1,64 @@ +/* + * Copyright 2025 https://github.com/openapi-processor/openapi-parser + * PDX-License-Identifier: Apache-2.0 + */ + +package io.openapiparser.model.v32; + +import io.openapiparser.Context; +import io.openapiparser.Properties; +import io.openapiparser.support.Required; +import io.openapiprocessor.jsonschema.schema.Bucket; +import org.checkerframework.checker.nullness.qual.Nullable; + +import java.util.Map; + +import static io.openapiparser.Keywords.*; + +/** + * the Info object. + * + *

See specification: + * 4.8.2 Info Object + */ +public class Info extends Properties implements Extensions { + + public Info (Context context, Bucket bucket) { + super (context, bucket); + } + + @Required + public String getTitle () { + return getStringOrThrow (TITLE); + } + + public @Nullable String getSummary () { + return getStringOrNull (SUMMARY); + } + + public @Nullable String getDescription () { + return getStringOrNull (DESCRIPTION); + } + + public @Nullable String getTermsOfService () { + return getStringOrNull (TERMS_OF_SERVICE); + } + + public @Nullable Contact getContact () { + return getObjectOrNull (CONTACT, Contact.class); + } + + public @Nullable License getLicense () { + return getObjectOrNull (LICENSE, License.class); + } + + @Required + public String getVersion () { + return getStringOrThrow (VERSION); + } + + @Override + public Map getExtensions () { + return super.getExtensions (); + } +} diff --git a/openapi-parser/src/main/java/io/openapiparser/model/v32/License.java b/openapi-parser/src/main/java/io/openapiparser/model/v32/License.java new file mode 100644 index 00000000..3e327729 --- /dev/null +++ b/openapi-parser/src/main/java/io/openapiparser/model/v32/License.java @@ -0,0 +1,47 @@ +/* + * Copyright 2025 https://github.com/openapi-processor/openapi-parser + * PDX-License-Identifier: Apache-2.0 + */ + +package io.openapiparser.model.v32; + +import io.openapiparser.Context; +import io.openapiparser.Properties; +import io.openapiparser.support.Required; +import io.openapiprocessor.jsonschema.schema.Bucket; +import org.checkerframework.checker.nullness.qual.Nullable; + +import java.util.Map; + +import static io.openapiparser.Keywords.*; + +/** + * the License object. + * + *

See specification: + * 4.8.4 License Object + */ +public class License extends Properties implements Extensions { + + public License (Context context, Bucket bucket) { + super (context, bucket); + } + + @Required + public String getName () { + return getStringOrThrow (NAME); + } + + public @Nullable String getIdentifier () { + return getStringOrNull (IDENTIFIER); + } + + public @Nullable String getUrl () { + return getStringOrNull (URL); + } + + @Override + public Map getExtensions () { + return super.getExtensions (); + } +} diff --git a/openapi-parser/src/main/java/io/openapiparser/model/v32/Link.java b/openapi-parser/src/main/java/io/openapiparser/model/v32/Link.java new file mode 100644 index 00000000..fcfc63a3 --- /dev/null +++ b/openapi-parser/src/main/java/io/openapiparser/model/v32/Link.java @@ -0,0 +1,31 @@ +/* + * Copyright 2025 https://github.com/openapi-processor/openapi-parser + * PDX-License-Identifier: Apache-2.0 + */ + +package io.openapiparser.model.v32; + +import io.openapiparser.Context; +import io.openapiparser.Properties; +import io.openapiprocessor.jsonschema.schema.Bucket; +import org.checkerframework.checker.nullness.qual.Nullable; + +import java.util.Map; + +/** + * the Link object. + * + *

See specification: + * 4.8.20 Link Object + */ +public class Link extends Properties implements Extensions { + + public Link (Context context, Bucket bucket) { + super (context, bucket); + } + + @Override + public Map getExtensions () { + return super.getExtensions (); + } +} diff --git a/openapi-parser/src/main/java/io/openapiparser/model/v32/MediaType.java b/openapi-parser/src/main/java/io/openapiparser/model/v32/MediaType.java new file mode 100644 index 00000000..096d4a54 --- /dev/null +++ b/openapi-parser/src/main/java/io/openapiparser/model/v32/MediaType.java @@ -0,0 +1,49 @@ +/* + * Copyright 2025 https://github.com/openapi-processor/openapi-parser + * PDX-License-Identifier: Apache-2.0 + */ + +package io.openapiparser.model.v32; + +import io.openapiparser.Context; +import io.openapiparser.Properties; +import io.openapiprocessor.jsonschema.schema.Bucket; +import org.checkerframework.checker.nullness.qual.Nullable; + +import java.util.Map; + +import static io.openapiparser.Keywords.*; + +/** + * the Media Type object. + * + *

See specification: + * 4.8.14 Media Type Object + */ +public class MediaType extends Properties implements Extensions { + + public MediaType (Context context, Bucket bucket) { + super (context, bucket); + } + + public @Nullable Schema getSchema () { + return getObjectOrNull (SCHEMA, Schema.class); + } + + public @Nullable Object getExample () { + return getRawValue (EXAMPLE); + } + + public Map getExamples () { + return getMapObjectsOrEmpty (EXAMPLES, Example.class); + } + + public Map getEncoding () { + return getMapObjectsOrEmpty (ENCODING, Encoding.class); + } + + @Override + public Map getExtensions () { + return super.getExtensions (); + } +} diff --git a/openapi-parser/src/main/java/io/openapiparser/model/v32/OpenApi.java b/openapi-parser/src/main/java/io/openapiparser/model/v32/OpenApi.java new file mode 100644 index 00000000..4ff04b86 --- /dev/null +++ b/openapi-parser/src/main/java/io/openapiparser/model/v32/OpenApi.java @@ -0,0 +1,84 @@ +/* + * Copyright 2025 https://github.com/openapi-processor/openapi-parser + * PDX-License-Identifier: Apache-2.0 + */ + +package io.openapiparser.model.v32; + +import io.openapiparser.Context; +import io.openapiparser.Properties; +import io.openapiparser.support.Required; +import io.openapiprocessor.jsonschema.schema.Bucket; +import org.checkerframework.checker.nullness.qual.Nullable; + +import java.util.Collection; +import java.util.Map; + +import static io.openapiparser.Keywords.*; + +/** + * the OpenAPI object. + * + *

See specification: + * 4.7.1 OpenAPI Object + */ +public class OpenApi extends Properties implements Extensions { + + public OpenApi (Context context, Bucket bucket) { + super (context, bucket); + } + + @Required + public String getOpenapi () { + return getStringOrThrow (OPENAPI); + } + + public @Nullable String getSelf() { + return getStringOrNull (SELF); + } + + @Required + public Info getInfo () { + return getObjectOrThrow (INFO, Info.class); + } + + public @Nullable String getJsonSchemaDialect () { + return getStringOrNull (JSON_SCHEMA_DIALECT); + } + + public Collection getServers () { + return getObjectsOrEmpty (SERVERS, Server.class); + } + + // @Required (if webhooks or components are null) + public @Nullable Paths getPaths () { + return getObjectOrNull (PATHS, Paths.class); + } + + // @Required (if paths or components are null) + public Map getWebhooks () { + return getMapObjectsOrEmpty (WEBHOOKS, PathItem.class); + } + + // @Required (if paths or webhooks are null) + public @Nullable Components getComponents () { + return getObjectOrNull (COMPONENTS, Components.class); + } + + public Collection getSecurity () { + return getObjectsOrEmpty (SECURITY, SecurityRequirement.class); + } + + public Collection getTags () { + return getObjectsOrEmpty (TAGS, Tag.class); + } + + public @Nullable ExternalDocumentation getExternalDocs () { + return getObjectOrNull (EXTERNAL_DOCS, ExternalDocumentation.class); + } + + @Override + public Map getExtensions () { + return super.getExtensions (); + } +} diff --git a/openapi-parser/src/main/java/io/openapiparser/model/v32/Operation.java b/openapi-parser/src/main/java/io/openapiparser/model/v32/Operation.java new file mode 100644 index 00000000..bccfeedc --- /dev/null +++ b/openapi-parser/src/main/java/io/openapiparser/model/v32/Operation.java @@ -0,0 +1,83 @@ +/* + * Copyright 2025 https://github.com/openapi-processor/openapi-parser + * PDX-License-Identifier: Apache-2.0 + */ + +package io.openapiparser.model.v32; + +import io.openapiparser.Context; +import io.openapiparser.Properties; +import io.openapiprocessor.jsonschema.schema.Bucket; +import org.checkerframework.checker.nullness.qual.Nullable; + +import java.util.Collection; +import java.util.Map; + +import static io.openapiparser.Keywords.*; + +/** + * the Operation object. + * + *

See specification: + * 4.8.10 Operation Object + */ +public class Operation extends Properties implements Extensions { + + public Operation (Context context, Bucket bucket) { + super (context, bucket); + } + + public Collection getTags () { + return getStringsOrEmpty (TAGS); + } + + public @Nullable String getSummary () { + return getStringOrNull (SUMMARY); + } + + public @Nullable String getDescription () { + return getStringOrNull (DESCRIPTION); + } + + public @Nullable ExternalDocumentation getExternalDocs () { + return getObjectOrNull (EXTERNAL_DOCS, ExternalDocumentation.class); + } + + public @Nullable String getOperationId () { + return getStringOrNull (OPERATION_ID); + } + + // todo include pathItem parameter + public Collection getParameters () { + return getObjectsOrEmpty (PARAMETERS, Parameter.class); + } + + public @Nullable RequestBody getRequestBody () { + return getObjectOrNull (REQUEST_BODY, RequestBody.class); + } + + public @Nullable Responses getResponses () { + return getObjectOrNull (RESPONSES, Responses.class); + } + + public Map getCallbacks () { + return getMapObjectsOrEmpty (CALLBACKS, Callback.class); + } + + public Boolean getDeprecated () { + return getBooleanOrFalse (DEPRECATED); + } + + public Collection getSecurity () { + return getObjectsOrEmpty (SECURITY, SecurityRequirement.class); + } + + public Collection getServers () { + return getObjectsOrEmpty (SERVERS, Server.class); + } + + @Override + public Map getExtensions () { + return super.getExtensions (); + } +} diff --git a/openapi-parser/src/main/java/io/openapiparser/model/v32/Parameter.java b/openapi-parser/src/main/java/io/openapiparser/model/v32/Parameter.java new file mode 100644 index 00000000..a84dde20 --- /dev/null +++ b/openapi-parser/src/main/java/io/openapiparser/model/v32/Parameter.java @@ -0,0 +1,128 @@ +/* + * Copyright 2025 https://github.com/openapi-processor/openapi-parser + * PDX-License-Identifier: Apache-2.0 + */ + +package io.openapiparser.model.v32; + +import io.openapiparser.Context; +import io.openapiparser.Properties; +import io.openapiparser.support.Required; +import io.openapiprocessor.jsonschema.schema.Bucket; +import org.checkerframework.checker.nullness.qual.Nullable; + +import java.util.Map; + +import static io.openapiparser.Keywords.*; + +/** + * the Parameter object. + * + *

See specification: + * 4.8.12 Parameter Object + */ +public class Parameter extends Properties implements Reference, Extensions { + + public Parameter (Context context, Bucket bucket) { + super (context, bucket); + } + + /** {@inheritDoc} */ + @Override + public boolean isRef () { + return hasProperty (REF); + } + + /** {@inheritDoc} */ + @Override + public String getRef () { + return getStringOrThrow (REF); + } + + public Parameter getRefObject () { + return getRefObjectOrThrow (Parameter.class); + } + + @Override + public @Nullable String getSummary () { + return getStringOrNull (SUMMARY); + } + + @Required + public String getName () { + return getStringOrThrow (NAME); + } + + @Required + public String getIn () { + return getStringOrThrow (IN); + } + + @Override + public @Nullable String getDescription () { + return getStringOrNull (DESCRIPTION); + } + + public Boolean getRequired () { + return getBooleanOrFalse (REQUIRED); + } + + public Boolean getDeprecated () { + return getBooleanOrFalse (DEPRECATED); + } + + public Boolean getAllowEmptyValue () { + return getBooleanOrFalse (ALLOW_EMPTY_VALUE); + } + + public String getStyle () { + String style = getStringOrNull (STYLE); + if (style != null) { + return style; + } + + final String in = getIn (); + switch (in) { + case "query": + case "cookie": + return "form"; + default: + return "simple"; + } + } + + public Boolean getExplode () { + Boolean explode = getBooleanOrNull (EXPLODE); + if (explode != null) { + return explode; + } + + final String style = getStyle (); + return "form".equals (style); + } + + public Boolean getAllowReserved () { + return getBooleanOrFalse (ALLOW_RESERVED); + } + + public @Nullable Schema getSchema () { + return getObjectOrNull (SCHEMA, Schema.class); + } + + public @Nullable Object getExample () { + return getRawValue (EXAMPLE); + } + + public Map getExamples () { + return getMapObjectsOrEmpty (EXAMPLES, Example.class); + } + + public Map getContent () { + return getMapObjectsOrEmpty (CONTENT, MediaType.class); + } + + @Override + public Map getExtensions () { + return super.getExtensions (); + } +} diff --git a/openapi-parser/src/main/java/io/openapiparser/model/v32/PathItem.java b/openapi-parser/src/main/java/io/openapiparser/model/v32/PathItem.java new file mode 100644 index 00000000..1c14d86a --- /dev/null +++ b/openapi-parser/src/main/java/io/openapiparser/model/v32/PathItem.java @@ -0,0 +1,118 @@ +/* + * Copyright 2025 https://github.com/openapi-processor/openapi-parser + * PDX-License-Identifier: Apache-2.0 + */ + +package io.openapiparser.model.v32; + +import io.openapiparser.Context; +import io.openapiparser.Properties; +import io.openapiprocessor.jsonschema.schema.Bucket; +import org.checkerframework.checker.nullness.qual.Nullable; + +import java.util.Collection; +import java.util.Collections; +import java.util.LinkedHashMap; +import java.util.Map; + +import static io.openapiparser.Keywords.*; + +/** + * the Path Item object. + * + *

See specification: + * 4.8.9 Path Item Object + */ +public class PathItem extends Properties implements Extensions, Reference { + + public PathItem (Context context, Bucket bucket) { + super (context, bucket); + } + + @Override + public boolean isRef () { + return hasProperty (REF); + } + + @Override + public String getRef () { + return getStringOrThrow (REF); + } + + public PathItem getRefObject () { + return getRefObjectOrThrow (PathItem.class); + } + + @Override + public @Nullable String getSummary () { + return getStringOrNull (SUMMARY); + } + + @Override + public @Nullable String getDescription () { + return getStringOrNull (DESCRIPTION); + } + + public @Nullable Operation getGet () { + return getOperationOrNull(GET); + } + + public @Nullable Operation getPut () { + return getOperationOrNull(PUT); + } + + public @Nullable Operation getPost () { + return getOperationOrNull(POST); + } + + public @Nullable Operation getDelete () { + return getOperationOrNull(DELETE); + } + + public @Nullable Operation getOptions () { + return getOperationOrNull(OPTIONS); + } + + public @Nullable Operation getHead () { + return getOperationOrNull(HEAD); + } + + public @Nullable Operation getPatch () { + return getOperationOrNull(PATCH); + } + + public @Nullable Operation getTrace () { + return getOperationOrNull(TRACE); + } + + public Map getOperations () { + Map operations = new LinkedHashMap<>(); + bucket.forEach ((operation, value) -> { + if (OPERATIONS.contains (operation)) { + operations.put(operation, getOperation (operation)); + } + }); + return Collections.unmodifiableMap (operations); + } + + public Collection getServers () { + return getObjectsOrEmpty (SERVERS, Server.class); + } + + public Collection getParameters () { + return getObjectsOrEmpty (PARAMETERS, Parameter.class); + } + + private Operation getOperation(String property) { + return getObjectOrThrow (property, Operation.class); + } + + private @Nullable Operation getOperationOrNull(String property) { + return getObjectOrNull (property, Operation.class); + } + + @Override + public Map getExtensions () { + return super.getExtensions (); + } +} diff --git a/openapi-parser/src/main/java/io/openapiparser/model/v32/Paths.java b/openapi-parser/src/main/java/io/openapiparser/model/v32/Paths.java new file mode 100644 index 00000000..27ea20a5 --- /dev/null +++ b/openapi-parser/src/main/java/io/openapiparser/model/v32/Paths.java @@ -0,0 +1,41 @@ +/* + * Copyright 2025 https://github.com/openapi-processor/openapi-parser + * PDX-License-Identifier: Apache-2.0 + */ + +package io.openapiparser.model.v32; + +import io.openapiparser.Context; +import io.openapiparser.Properties; +import io.openapiparser.support.Required; +import io.openapiprocessor.jsonschema.schema.Bucket; +import org.checkerframework.checker.nullness.qual.Nullable; + +import java.util.Map; + +/** + * the Paths object. + * + *

See specification: + * 4.8.8 Paths Object + */ +public class Paths extends Properties implements Extensions { + + public Paths (Context context, Bucket bucket) { + super (context, bucket); + } + + @Required + public Map getPathItems () { + return getMapObjectsOrEmpty (PathItem.class); + } + + public @Nullable PathItem getPathItem (String path) { + return getObjectOrNull (path, PathItem.class); + } + + @Override + public Map getExtensions () { + return super.getExtensions (); + } +} diff --git a/openapi-parser/src/main/java/io/openapiparser/model/v32/Reference.java b/openapi-parser/src/main/java/io/openapiparser/model/v32/Reference.java new file mode 100644 index 00000000..b809e1ec --- /dev/null +++ b/openapi-parser/src/main/java/io/openapiparser/model/v32/Reference.java @@ -0,0 +1,41 @@ +/* + * Copyright 2025 https://github.com/openapi-processor/openapi-parser + * PDX-License-Identifier: Apache-2.0 + */ + +package io.openapiparser.model.v32; + +import io.openapiparser.support.Required; +import io.openapiprocessor.jsonschema.converter.NoValueException; +import org.checkerframework.checker.nullness.qual.Nullable; + +/** + * the Reference object. + * + *

See specification: + * 4.8.23 Reference Object + */ +public interface Reference { + + /** + * check if this is a $ref object. + * + * @return true if $ref else false. + */ + boolean isRef (); + + /** + * $ref value. Should be guarded by {@link #isRef()}. Throws if {@link #isRef()} is false. + * + * @return ref + * @throws NoValueException if {@link #isRef()} is false + * + * // todo do not throw, let getRefObject() throw + */ + @Required + String getRef (); + + @Nullable String getSummary(); + + @Nullable String getDescription(); +} diff --git a/openapi-parser/src/main/java/io/openapiparser/model/v32/RequestBody.java b/openapi-parser/src/main/java/io/openapiparser/model/v32/RequestBody.java new file mode 100644 index 00000000..ff9ce718 --- /dev/null +++ b/openapi-parser/src/main/java/io/openapiparser/model/v32/RequestBody.java @@ -0,0 +1,66 @@ +/* + * Copyright 2025 https://github.com/openapi-processor/openapi-parser + * PDX-License-Identifier: Apache-2.0 + */ + +package io.openapiparser.model.v32; + +import io.openapiparser.Context; +import io.openapiparser.Properties; +import io.openapiprocessor.jsonschema.schema.Bucket; +import org.checkerframework.checker.nullness.qual.Nullable; + +import java.util.Map; + +import static io.openapiparser.Keywords.*; + +/** + * the Request Body object. + * + *

See specification: + * 4.8.13 Request Body Object + */ +public class RequestBody extends Properties implements Reference, Extensions { + + public RequestBody (Context context, Bucket bucket) { + super (context, bucket); + } + + /** {@inheritDoc} */ + @Override + public boolean isRef () { + return hasProperty (REF); + } + + /** {@inheritDoc} */ + @Override + public String getRef () { + return getStringOrThrow (REF); + } + + @Override + public @Nullable String getSummary () { + return getStringOrNull (SUMMARY); + } + + public RequestBody getRefObject () { + return getRefObjectOrThrow (RequestBody.class); + } + + public @Nullable String getDescription () { + return getStringOrNull (DESCRIPTION); + } + + public Map getContent () { + return getMapObjectsOrEmpty (CONTENT, MediaType.class); + } + + public Boolean getRequired () { + return getBooleanOrDefault (REQUIRED, false); + } + + @Override + public Map getExtensions () { + return super.getExtensions (); + } +} diff --git a/openapi-parser/src/main/java/io/openapiparser/model/v32/Response.java b/openapi-parser/src/main/java/io/openapiparser/model/v32/Response.java new file mode 100644 index 00000000..f2dca5bd --- /dev/null +++ b/openapi-parser/src/main/java/io/openapiparser/model/v32/Response.java @@ -0,0 +1,73 @@ +/* + * Copyright 2025 https://github.com/openapi-processor/openapi-parser + * PDX-License-Identifier: Apache-2.0 + */ + +package io.openapiparser.model.v32; + +import io.openapiparser.Context; +import io.openapiparser.Properties; +import io.openapiparser.support.Required; +import io.openapiprocessor.jsonschema.schema.Bucket; +import org.checkerframework.checker.nullness.qual.Nullable; + +import java.util.Map; + +import static io.openapiparser.Keywords.*; + +/** + * the Response object. + * + *

See specification: + * 4.8.16 Response Object + */ +public class Response extends Properties implements Reference, Extensions { + + public Response (Context context, Bucket bucket) { + super (context, bucket); + } + + /** {@inheritDoc} */ + @Override + public boolean isRef () { + return hasProperty (REF); + } + + /** {@inheritDoc} */ + @Override + public String getRef () { + return getStringOrThrow (REF); + } + + public Response getRefObject () { + return getRefObjectOrThrow (Response.class); + } + + @Override + public @Nullable String getSummary () { + return getStringOrNull (SUMMARY); + } + + @Required + @Override + public String getDescription () { + return getStringOrThrow (DESCRIPTION); + } + + public Map getHeaders () { + return getMapObjectsOrEmpty (HEADERS, Header.class); + } + + public Map getContent () { + return getMapObjectsOrEmpty (CONTENT, MediaType.class); + } + + public Map getLinks () { + return getMapObjectsOrEmpty (LINKS, Link.class); + } + + @Override + public Map getExtensions () { + return super.getExtensions (); + } +} diff --git a/openapi-parser/src/main/java/io/openapiparser/model/v32/Responses.java b/openapi-parser/src/main/java/io/openapiparser/model/v32/Responses.java new file mode 100644 index 00000000..420ae015 --- /dev/null +++ b/openapi-parser/src/main/java/io/openapiparser/model/v32/Responses.java @@ -0,0 +1,45 @@ +/* + * Copyright 2025 https://github.com/openapi-processor/openapi-parser + * PDX-License-Identifier: Apache-2.0 + */ + +package io.openapiparser.model.v32; + +import io.openapiparser.Context; +import io.openapiparser.Properties; +import io.openapiprocessor.jsonschema.schema.Bucket; +import org.checkerframework.checker.nullness.qual.Nullable; + +import java.util.Map; + +import static io.openapiparser.Keywords.DEFAULT; + +/** + * the Responses object. + * + *

See specification: + * 4.8.16 Responses Object + */ +public class Responses extends Properties implements Extensions { + + public Responses (Context context, Bucket bucket) { + super (context, bucket); + } + + public Map getResponses () { + return getMapObjectsOrEmpty (Response.class); + } + + public @Nullable Response getResponse (String httpStatus) { + return getObjectOrNull (httpStatus, Response.class); + } + + public @Nullable Response getDefault () { + return getObjectOrNull (DEFAULT, Response.class); + } + + @Override + public Map getExtensions () { + return super.getExtensions (); + } +} diff --git a/openapi-parser/src/main/java/io/openapiparser/model/v32/Schema.java b/openapi-parser/src/main/java/io/openapiparser/model/v32/Schema.java new file mode 100644 index 00000000..922df478 --- /dev/null +++ b/openapi-parser/src/main/java/io/openapiparser/model/v32/Schema.java @@ -0,0 +1,486 @@ +/* + * Copyright 2025 https://github.com/openapi-processor/openapi-parser + * PDX-License-Identifier: Apache-2.0 + */ + +package io.openapiparser.model.v32; + +import io.openapiparser.Context; +import io.openapiparser.Properties; +import io.openapiprocessor.jsonschema.converter.NoValueException; +import io.openapiprocessor.jsonschema.schema.Bucket; +import org.checkerframework.checker.nullness.qual.Nullable; + +import java.util.Collection; +import java.util.Collections; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + +import static io.openapiparser.Keywords.*; + +/** + * the Schema object. + * + *

See specification: + * 4.8.24 Schema Object + * JSON Schema + * JSON Schema + * Validation + */ +public class Schema extends Properties implements Reference, Extensions { + + public Schema (Context context, Bucket bucket) { + super (context, bucket); + } + + @Override + public boolean isRef () { + return hasProperty (REF); + } + + @Override + public String getRef () { + return getStringOrThrow (REF); + } + + public Schema getRefObject () { + return getRefObjectOrThrow (Schema.class); + } + + @Override + public @Nullable String getSummary () { + return getStringOrNull (SUMMARY); + } + + /** + * JSON Schema Validation: metadata + */ + @Override + public @Nullable String getDescription () { + return getStringOrNull (DESCRIPTION); + } + + // JSON Schema: metadata keyword $schema + // JSON Schema: metadata keyword $vocabulary + // JSON Schema: metadata keyword $id + // JSON Schema: core keyword $dynamicRef + // JSON Schema: core keyword $defs + // JSON Schema: core keyword $comment + + /** + * JSON Schema: subschemas logic keyword + * + * @return all of or empty if missing + */ + public Collection getAllOf () { + return getObjectsOrEmpty (ALL_OF, Schema.class); + } + + /** + * JSON Schema: subschemas logic keyword + * + * @return any of or empty if missing + */ + public Collection getAnyOf () { + return getObjectsOrEmpty (ANY_OF, Schema.class); + } + + /** + * JSON Schema: subschemas logic keyword + * + * @return one of or empty if missing + */ + public Collection getOneOf () { + return getObjectsOrEmpty (ONE_OF, Schema.class); + } + + /** + * JSON Schema: subschemas logic keyword + * + * @return not or null if missing + */ + public @Nullable Schema getNot () { + return getObjectOrNull (NOT, Schema.class); + } + + // JSON Schema: subschemas conditional keyword if + // JSON Schema: subschemas conditional keyword then + // JSON Schema: subschemas conditional keyword else + // JSON Schema: subschemas conditional keyword dependentSchemas + + /** + * JSON Schema: subschemas array keyword + * + * @return prefix items or empty if missing + */ + public Collection getPrefixItems () { + return getObjectsOrEmpty (PREFIX_ITEMS, Schema.class); + } + + /** + * JSON Schema: subschemas array keyword + * + * @return items or null if missing + */ + public @Nullable Schema getItems () { + return getObjectOrNull (ITEMS, Schema.class); + } + + /** + * JSON Schema: subschemas array keyword + * + * @return contains or null if missing + */ + public @Nullable Schema getContains () { + return getObjectOrNull (CONTAINS, Schema.class); + } + + /** + * JSON Schema: subschemas object keyword + * + * @return properties map or empty if missing + */ + public Map getProperties () { + return getMapObjectsOrEmpty (PROPERTIES, Schema.class); + } + + /** + * JSON Schema: subschemas object keyword + * + * @return pattern properties map, empty if missing + */ + public Map getPatternProperties () { + return getMapObjectsOrEmpty (PATTERN_PROPERTIES, Schema.class); + } + + /** + * JSON Schema: subschemas object keyword + * + * @return additional properties or null if missing + */ + public @Nullable Schema getAdditionalProperties () { + return getObjectOrNull (ADDITIONAL_PROPERTIES, Schema.class); + } + + /** + * JSON Schema: subschemas object keyword + * + * @return property names or null if missing + */ + public @Nullable Schema getPropertyNames () { + return getObjectOrNull (PROPERTY_NAMES, Schema.class); + } + + // JSON Schema: subschemas unevaluated keyword unevaluatedItems + // JSON Schema: subschemas unevaluated keyword unevaluatedProperties + + /** + * JSON Schema Validation: validation keyword for any instance type + * + * @return types, throws if empty + */ + public Collection getType () { + final Object value = getRawValue (TYPE); + if (value == null) { + return Collections.emptyList (); + } else if (value instanceof String) { + return Collections.singletonList (getStringOrThrow (TYPE)); + } else if (value instanceof Collection) { + Collection types = getStringsOrEmpty (TYPE); + return types.stream () + .map (t -> t == null ? "null" : t) + .collect(Collectors.toList ()); + } else { + throw new NoValueException ("todo"/*getSource ().getPath (TYPE)*/); + } + } + + /** + * JSON Schema Validation: validation keyword for any instance type + * + * @return enum values or empty if missing + * + * todo any type + */ + public @Nullable Collection getEnum () { + return getStringsOrNull (ENUM); + } + + /** + * JSON Schema Validation: validation keyword for any instance type + * + * @return const or null if missing + */ + public @Nullable String getConst () { + return getStringOrNull (CONST); + } + + /** + * JSON Schema Validation: validation Keywords for numeric instances (number and integer) + * + * @return multiple of or null if missing + */ + public @Nullable Number getMultipleOf () { + return getNumberOrNull (MULTIPLE_OF); + } + + /** + * JSON Schema Validation: validation Keywords for numeric instances (number and integer) + * + * @return maximum or null if missing + */ + public @Nullable Number getMaximum () { + return getNumberOrNull (MAXIMUM); + } + + /** + * JSON Schema Validation: validation Keywords for numeric instances (number and integer) + * + * @return exclusive maximum or null if missing + */ + public @Nullable Number getExclusiveMaximum () { + return getNumberOrNull (EXCLUSIVE_MAXIMUM); + } + + /** + * JSON Schema Validation: validation Keywords for numeric instances (number and integer) + * + * @return minimum or null if missing + */ + public @Nullable Number getMinimum () { + return getNumberOrNull (MINIMUM); + } + + /** + * JSON Schema Validation: validation Keywords for numeric instances (number and integer) + * + * @return exclusive minimum or null if missing + */ + public @Nullable Number getExclusiveMinimum () { + return getNumberOrNull (EXCLUSIVE_MINIMUM); + } + + /** + * JSON Schema Validation: validation Keywords for strings + * + * @return max length or null if missing + */ + public @Nullable Number getMaxLength () { + return getNumberOrNull (MAX_LENGTH); + } + + /** + * JSON Schema Validation: validation Keywords for strings + * + * @return min length or null if missing + */ + public @Nullable Number getMinLength () { + return getNumberOrNull (MIN_LENGTH); + } + + /** + * JSON Schema Validation: validation Keywords for strings + * + * @return pattern or null if missing + */ + public @Nullable String getPattern () { + return getStringOrNull (PATTERN); + } + + /** + * JSON Schema Validation: validation Keywords for arrays + * + * @return max items or null if missing + */ + public @Nullable Integer getMaxItems () { + return getIntegerOrNull (MAX_ITEMS); + } + + /** + * JSON Schema Validation: validation Keywords for arrays + * + * @return min items or 0 if missing + */ + public Integer getMinItems () { + return getIntegerOrDefault (MIN_ITEMS, 0); + } + + /** + * JSON Schema Validation: validation Keywords for arrays + * + * @return unique items or false if missing + */ + public Boolean getUniqueItems () { + return getBooleanOrDefault (UNIQUE_ITEMS, false); + } + + /** + * JSON Schema Validation: validation Keywords for arrays + * + * @return max contains or null if missing + */ + public @Nullable Integer getMaxContains () { + return getIntegerOrNull (MAX_CONTAINS); + } + + /** + * JSON Schema Validation: validation Keywords for arrays + * + * @return min contains or 1 if missing + */ + public Integer getMinContains () { + return getIntegerOrDefault (MIN_CONTAINS, 1); + } + + /** + * JSON Schema Validation: validation Keywords for objects + * + * @return max properties or null if missing + */ + public @Nullable Integer getMaxProperties () { + return getIntegerOrNull (MAX_PROPERTIES); + } + + /** + * JSON Schema Validation: validation Keywords for objects + * + * @return min properties or 0 if missing + */ + public Integer getMinProperties () { + return getIntegerOrDefault (MIN_PROPERTIES, 0); + } + + /** + * JSON Schema Validation: validation Keywords for objects + * + * @return required properties or empty if missing + */ + public Collection getRequired () { + return getStringsOrEmpty (REQUIRED); + } + + /** + * JSON Schema Validation: validation Keywords for objects + * + * @return dependent required map, may be empty + */ + public Map> getDependentRequired () { + return getMapSetStringsOrEmpty (DEPENDENT_REQUIRED); + } + + /** + * JSON Schema Validation: semantic format + * + * @return format or null if missing + */ + public @Nullable String getFormat () { + return getStringOrNull (FORMAT); + } + + /* todo contentEncoding + * JSON Schema Validation: string-encoded data + */ + + /* todo contentMediaType + * JSON Schema Validation: string-encoded data + */ + + /* todo contentSchema + * JSON Schema Validation: string-encoded data + */ + + /** + * JSON Schema Validation: metadata + * + * @return title or null if missing + */ + public @Nullable String getTitle () { + return getStringOrNull (TITLE); + } + + /** + * JSON Schema Validation: metadata + * + * @return default or null + */ + public @Nullable Object getDefault () { + return getRawValue (DEFAULT); + } + + /** + * JSON Schema Validation: metadata + * + * @return true or false + */ + public Boolean getDeprecated () { + return getBooleanOrDefault (DEPRECATED, false); + } + + /** + * JSON Schema Validation: metadata + * + * @return true or false + */ + public Boolean getReadOnly () { + return getBooleanOrDefault (READ_ONLY, false); + } + + /** + * JSON Schema Validation: metadata + * + * @return true or false + */ + public Boolean getWriteOnly () { + return getBooleanOrDefault (WRITE_ONLY, false); + } + + /* todo examples + * JSON Schema Validation: metadata + */ + + /** + * OpenAPI base vocabulary + * + * @return discriminator or null if missing + */ + public @Nullable Discriminator getDiscriminator () { + return getObjectOrNull (DISCRIMINATOR, Discriminator.class); + } + + /** + * OpenAPI base vocabulary + * + * @return xml or null if missing + */ + public @Nullable Xml getXml () { + return getObjectOrNull (XML, Xml.class); + } + + /** + * OpenAPI base vocabulary + * + * @return external documentation or null if missing + */ + public @Nullable ExternalDocumentation getExternalDocs () { + return getObjectOrNull (EXTERNAL_DOCS, ExternalDocumentation.class); + } + + /** + * OpenAPI base vocabulary + * + * @return example or null if missing + */ + @Deprecated + public @Nullable Object getExample () { + return getRawValue (EXAMPLE); + } + + /** + * todo not required to have x- prefix + */ + @Override + public Map getExtensions () { + return super.getExtensions (); + } +} diff --git a/openapi-parser/src/main/java/io/openapiparser/model/v32/SecurityRequirement.java b/openapi-parser/src/main/java/io/openapiparser/model/v32/SecurityRequirement.java new file mode 100644 index 00000000..9d90071c --- /dev/null +++ b/openapi-parser/src/main/java/io/openapiparser/model/v32/SecurityRequirement.java @@ -0,0 +1,25 @@ +/* + * Copyright 2025 https://github.com/openapi-processor/openapi-parser + * PDX-License-Identifier: Apache-2.0 + */ + +package io.openapiparser.model.v32; + +import io.openapiparser.Context; +import io.openapiparser.Properties; +import io.openapiprocessor.jsonschema.schema.Bucket; + +/** + * the Security Requirement object. + * + *

See specification: + * + * 4.8.30 Security Requirement Object + * + */ +public class SecurityRequirement extends Properties { + + public SecurityRequirement (Context context, Bucket bucket) { + super (context, bucket); + } +} diff --git a/openapi-parser/src/main/java/io/openapiparser/model/v32/SecurityScheme.java b/openapi-parser/src/main/java/io/openapiparser/model/v32/SecurityScheme.java new file mode 100644 index 00000000..3ad01049 --- /dev/null +++ b/openapi-parser/src/main/java/io/openapiparser/model/v32/SecurityScheme.java @@ -0,0 +1,33 @@ +/* + * Copyright 2025 https://github.com/openapi-processor/openapi-parser + * PDX-License-Identifier: Apache-2.0 + */ + +package io.openapiparser.model.v32; + +import io.openapiparser.Context; +import io.openapiparser.Properties; +import io.openapiprocessor.jsonschema.schema.Bucket; +import org.checkerframework.checker.nullness.qual.Nullable; + +import java.util.Map; + +/** + * the Security Scheme object. + * + *

See specification: + * + * 4.8.28 Security Scheme Object + * + */ +public class SecurityScheme extends Properties implements Extensions { + + public SecurityScheme (Context context, Bucket bucket) { + super (context, bucket); + } + + @Override + public Map getExtensions () { + return super.getExtensions (); + } +} diff --git a/openapi-parser/src/main/java/io/openapiparser/model/v32/Server.java b/openapi-parser/src/main/java/io/openapiparser/model/v32/Server.java new file mode 100644 index 00000000..b77a5863 --- /dev/null +++ b/openapi-parser/src/main/java/io/openapiparser/model/v32/Server.java @@ -0,0 +1,47 @@ +/* + * Copyright 2025 https://github.com/openapi-processor/openapi-parser + * PDX-License-Identifier: Apache-2.0 + */ + +package io.openapiparser.model.v32; + +import io.openapiparser.Context; +import io.openapiparser.Properties; +import io.openapiparser.support.Required; +import io.openapiprocessor.jsonschema.schema.Bucket; +import org.checkerframework.checker.nullness.qual.Nullable; + +import java.util.Map; + +import static io.openapiparser.Keywords.*; + +/** + * the Server object. + * + *

See specification: + * 4.8.5 Server Object + */ +public class Server extends Properties implements Extensions { + + public Server (Context context, Bucket bucket) { + super (context, bucket); + } + + @Required + public String getUrl () { + return getStringOrThrow (URL); + } + + public @Nullable String getDescription () { + return getStringOrNull (DESCRIPTION); + } + + public Map getVariables () { + return getMapObjectsOrEmpty (VARIABLES, ServerVariable.class); + } + + @Override + public Map getExtensions () { + return super.getExtensions (); + } +} diff --git a/openapi-parser/src/main/java/io/openapiparser/model/v32/ServerVariable.java b/openapi-parser/src/main/java/io/openapiparser/model/v32/ServerVariable.java new file mode 100644 index 00000000..c7b4e07e --- /dev/null +++ b/openapi-parser/src/main/java/io/openapiparser/model/v32/ServerVariable.java @@ -0,0 +1,48 @@ +/* + * Copyright 2025 https://github.com/openapi-processor/openapi-parser + * PDX-License-Identifier: Apache-2.0 + */ + +package io.openapiparser.model.v32; + +import io.openapiparser.Context; +import io.openapiparser.Properties; +import io.openapiparser.support.Required; +import io.openapiprocessor.jsonschema.schema.Bucket; +import org.checkerframework.checker.nullness.qual.Nullable; + +import java.util.Collection; +import java.util.Map; + +import static io.openapiparser.Keywords.*; + +/** + * the Server Variable object. + * + *

See specification: + * 4.8.6 Server Variable Object + */ +public class ServerVariable extends Properties implements Extensions { + + public ServerVariable (Context context, Bucket bucket) { + super (context, bucket); + } + + public Collection getEnum () { + return getStringsOrEmpty (ENUM); + } + + @Required + public String getDefault () { + return getStringOrThrow (DEFAULT); + } + + public @Nullable String getDescription () { + return getStringOrNull (DESCRIPTION); + } + + @Override + public Map getExtensions () { + return super.getExtensions (); + } +} diff --git a/openapi-parser/src/main/java/io/openapiparser/model/v32/Tag.java b/openapi-parser/src/main/java/io/openapiparser/model/v32/Tag.java new file mode 100644 index 00000000..fbf8e2e7 --- /dev/null +++ b/openapi-parser/src/main/java/io/openapiparser/model/v32/Tag.java @@ -0,0 +1,31 @@ +/* + * Copyright 2025 https://github.com/openapi-processor/openapi-parser + * PDX-License-Identifier: Apache-2.0 + */ + +package io.openapiparser.model.v32; + +import io.openapiparser.Context; +import io.openapiparser.Properties; +import io.openapiprocessor.jsonschema.schema.Bucket; +import org.checkerframework.checker.nullness.qual.Nullable; + +import java.util.Map; + +/** + * the Tag object. + * + *

See specification: + * 4.8.22 Tag Object + */ +public class Tag extends Properties implements Extensions { + + public Tag (Context context, Bucket bucket) { + super (context, bucket); + } + + @Override + public Map getExtensions () { + return super.getExtensions (); + } +} diff --git a/openapi-parser/src/main/java/io/openapiparser/model/v32/Xml.java b/openapi-parser/src/main/java/io/openapiparser/model/v32/Xml.java new file mode 100644 index 00000000..31f11ee1 --- /dev/null +++ b/openapi-parser/src/main/java/io/openapiparser/model/v32/Xml.java @@ -0,0 +1,31 @@ +/* + * Copyright 2025 https://github.com/openapi-processor/openapi-parser + * PDX-License-Identifier: Apache-2.0 + */ + +package io.openapiparser.model.v32; + +import io.openapiparser.Context; +import io.openapiparser.Properties; +import io.openapiprocessor.jsonschema.schema.Bucket; +import org.checkerframework.checker.nullness.qual.Nullable; + +import java.util.Map; + +/** + * the XML object. + * + *

See specification: + * 4.8.26 XML Object + */ +public class Xml extends Properties implements Extensions { + + public Xml (Context context, Bucket bucket) { + super (context, bucket); + } + + @Override + public Map getExtensions () { + return super.getExtensions (); + } +} From a5a8f36cf0ffec4ba00d0252ff1a30f68a1ece55 Mon Sep 17 00:00:00 2001 From: Martin Hauner Date: Fri, 5 Sep 2025 11:16:47 +0200 Subject: [PATCH 10/11] add 3.2 checks --- .../openapiparser/model/v3x/CallbackSpec.kt | 4 + .../openapiparser/model/v3x/ComponentsSpec.kt | 20 +++++ .../io/openapiparser/model/v3x/ContactSpec.kt | 8 ++ .../model/v3x/DiscriminatorSpec.kt | 8 ++ .../openapiparser/model/v3x/EncodingSpec.kt | 13 +++- .../io/openapiparser/model/v3x/ExampleSpec.kt | 9 +++ .../model/v3x/ExternalDocumentationSpec.kt | 5 ++ .../io/openapiparser/model/v3x/HeaderSpec.kt | 57 +++++++++++++- .../io/openapiparser/model/v3x/InfoSpec.kt | 15 +++- .../io/openapiparser/model/v3x/LicenseSpec.kt | 6 ++ .../openapiparser/model/v3x/MediaTypeSpec.kt | 40 ++++++++++ .../io/openapiparser/model/v3x/OpenApiSpec.kt | 31 +++++++- .../openapiparser/model/v3x/OperationSpec.kt | 35 ++++++++- .../openapiparser/model/v3x/ParameterSpec.kt | 64 ++++++++++++++++ .../openapiparser/model/v3x/PathItemSpec.kt | 25 ++++++- .../io/openapiparser/model/v3x/PathsSpec.kt | 8 ++ .../model/v3x/RequestBodySpec.kt | 32 +++++++- .../openapiparser/model/v3x/ResponseSpec.kt | 33 ++++++++ .../openapiparser/model/v3x/ResponsesSpec.kt | 19 +++++ .../io/openapiparser/model/v3x/SchemaSpec.kt | 75 ++++++++++++++++++- .../io/openapiparser/model/v3x/ServerSpec.kt | 8 ++ .../model/v3x/ServerVariableSpec.kt | 7 ++ 22 files changed, 509 insertions(+), 13 deletions(-) diff --git a/openapi-parser/src/test/kotlin/io/openapiparser/model/v3x/CallbackSpec.kt b/openapi-parser/src/test/kotlin/io/openapiparser/model/v3x/CallbackSpec.kt index 30663a68..60af7c2f 100644 --- a/openapi-parser/src/test/kotlin/io/openapiparser/model/v3x/CallbackSpec.kt +++ b/openapi-parser/src/test/kotlin/io/openapiparser/model/v3x/CallbackSpec.kt @@ -10,6 +10,7 @@ import io.kotest.matchers.nulls.shouldNotBeNull import io.kotest.matchers.shouldBe import io.openapiparser.model.v30.callback as callback30 import io.openapiparser.model.v31.callback as callback31 +import io.openapiparser.model.v32.callback as callback32 class CallbackSpec: StringSpec ({ @@ -20,6 +21,7 @@ class CallbackSpec: StringSpec ({ callback30(source).getPathItem("/foo").shouldNotBeNull() callback31(source).getPathItem("/foo").shouldNotBeNull() + callback32(source).getPathItem("/foo").shouldNotBeNull() } fun assertPathItems (pathItems: Map) { @@ -36,8 +38,10 @@ class CallbackSpec: StringSpec ({ assertPathItems(callback30(source).pathItems) assertPathItems(callback31(source).pathItems) + assertPathItems(callback32(source).pathItems) } include(testExtensions("Callback 30", ::callback30) { it.extensions }) include(testExtensions("Callback 31", ::callback31) { it.extensions }) + include(testExtensions("Callback 32", ::callback32) { it.extensions }) }) diff --git a/openapi-parser/src/test/kotlin/io/openapiparser/model/v3x/ComponentsSpec.kt b/openapi-parser/src/test/kotlin/io/openapiparser/model/v3x/ComponentsSpec.kt index e409a58a..0fefefb8 100644 --- a/openapi-parser/src/test/kotlin/io/openapiparser/model/v3x/ComponentsSpec.kt +++ b/openapi-parser/src/test/kotlin/io/openapiparser/model/v3x/ComponentsSpec.kt @@ -11,6 +11,7 @@ import io.kotest.matchers.nulls.shouldNotBeNull import io.kotest.matchers.shouldBe import io.openapiparser.model.v30.components as components30 import io.openapiparser.model.v31.components as components31 +import io.openapiparser.model.v32.components as components32 class ComponentsSpec: StringSpec({ @@ -29,11 +30,13 @@ class ComponentsSpec: StringSpec({ assertMap(components30(source).schemas) assertMap(components31(source).schemas) + assertMap(components32(source).schemas) } "gets components schemas is empty if missing" { components30().schemas.shouldBeEmpty() components31().schemas.shouldBeEmpty() + components32().schemas.shouldBeEmpty() } "gets components responses" { @@ -45,11 +48,13 @@ class ComponentsSpec: StringSpec({ assertMap(components30(source).responses) assertMap(components31(source).responses) + assertMap(components32(source).responses) } "gets components responses is empty if missing" { components30().responses.shouldBeEmpty() components31().responses.shouldBeEmpty() + components32().responses.shouldBeEmpty() } "gets components parameters" { @@ -61,11 +66,13 @@ class ComponentsSpec: StringSpec({ assertMap(components30(source).parameters) assertMap(components31(source).parameters) + assertMap(components32(source).parameters) } "gets components parameters is empty if missing" { components30().parameters.shouldBeEmpty() components31().parameters.shouldBeEmpty() + components32().parameters.shouldBeEmpty() } "gets components examples" { @@ -77,11 +84,13 @@ class ComponentsSpec: StringSpec({ assertMap(components30(source).examples) assertMap(components31(source).examples) + assertMap(components32(source).examples) } "gets components examples is empty if missing" { components30().examples.shouldBeEmpty() components31().examples.shouldBeEmpty() + components32().examples.shouldBeEmpty() } "gets components requestBodies" { @@ -93,11 +102,13 @@ class ComponentsSpec: StringSpec({ assertMap(components30(source).requestBodies) assertMap(components31(source).requestBodies) + assertMap(components32(source).requestBodies) } "gets components requestBodies is empty if missing" { components30().requestBodies.shouldBeEmpty() components31().requestBodies.shouldBeEmpty() + components32().requestBodies.shouldBeEmpty() } "gets components headers" { @@ -109,11 +120,13 @@ class ComponentsSpec: StringSpec({ assertMap(components30(source).headers) assertMap(components31(source).headers) + assertMap(components32(source).headers) } "gets components headers is empty if missing" { components30().headers.shouldBeEmpty() components31().headers.shouldBeEmpty() + components32().headers.shouldBeEmpty() } "gets components securitySchemes" { @@ -125,11 +138,13 @@ class ComponentsSpec: StringSpec({ assertMap(components30(source).securitySchemes) assertMap(components31(source).securitySchemes) + assertMap(components32(source).securitySchemes) } "gets components securitySchemes is empty if missing" { components30().securitySchemes.shouldBeEmpty() components31().securitySchemes.shouldBeEmpty() + components32().securitySchemes.shouldBeEmpty() } "gets components links" { @@ -141,11 +156,13 @@ class ComponentsSpec: StringSpec({ assertMap(components30(source).links) assertMap(components31(source).links) + assertMap(components32(source).links) } "gets components links is empty if missing" { components30().links.shouldBeEmpty() components31().links.shouldBeEmpty() + components32().links.shouldBeEmpty() } "gets components callbacks" { @@ -157,13 +174,16 @@ class ComponentsSpec: StringSpec({ assertMap(components30(source).callbacks) assertMap(components31(source).callbacks) + assertMap(components32(source).callbacks) } "gets components callbacks is empty if missing" { components30().callbacks.shouldBeEmpty() components31().callbacks.shouldBeEmpty() + components32().callbacks.shouldBeEmpty() } include(testExtensions("Components 30", ::components30) { it.extensions }) include(testExtensions("Components 31", ::components31) { it.extensions }) + include(testExtensions("Components 32", ::components32) { it.extensions }) }) diff --git a/openapi-parser/src/test/kotlin/io/openapiparser/model/v3x/ContactSpec.kt b/openapi-parser/src/test/kotlin/io/openapiparser/model/v3x/ContactSpec.kt index f72e0ee3..0368c6ca 100644 --- a/openapi-parser/src/test/kotlin/io/openapiparser/model/v3x/ContactSpec.kt +++ b/openapi-parser/src/test/kotlin/io/openapiparser/model/v3x/ContactSpec.kt @@ -10,39 +10,47 @@ import io.kotest.matchers.nulls.shouldBeNull import io.kotest.matchers.shouldBe import io.openapiparser.model.v30.contact as contact30 import io.openapiparser.model.v31.contact as contact31 +import io.openapiparser.model.v32.contact as contact32 class ContactSpec: StringSpec({ "gets contact name" { contact30("name: contact name").name shouldBe "contact name" contact31("name: contact name").name shouldBe "contact name" + contact32("name: contact name").name shouldBe "contact name" } "gets contact name is null if missing" { contact30().name.shouldBeNull() contact31().name.shouldBeNull() + contact32().name.shouldBeNull() } "gets contact url" { contact30("url: https://contact.url").url shouldBe "https://contact.url" contact31("url: https://contact.url").url shouldBe "https://contact.url" + contact32("url: https://contact.url").url shouldBe "https://contact.url" } "gets contact url is null if missing" { contact30().url.shouldBeNull() contact31().url.shouldBeNull() + contact32().url.shouldBeNull() } "gets contact email" { contact30("email: contact@email").email shouldBe "contact@email" contact31("email: contact@email").email shouldBe "contact@email" + contact32("email: contact@email").email shouldBe "contact@email" } "gets contact email is null if missing" { contact30().email.shouldBeNull() contact31().email.shouldBeNull() + contact32().email.shouldBeNull() } include(testExtensions("Contact30", ::contact30) { it.extensions }) include(testExtensions("Contact31", ::contact31) { it.extensions }) + include(testExtensions("Contact32", ::contact32) { it.extensions }) }) diff --git a/openapi-parser/src/test/kotlin/io/openapiparser/model/v3x/DiscriminatorSpec.kt b/openapi-parser/src/test/kotlin/io/openapiparser/model/v3x/DiscriminatorSpec.kt index c12c4957..58e7a572 100644 --- a/openapi-parser/src/test/kotlin/io/openapiparser/model/v3x/DiscriminatorSpec.kt +++ b/openapi-parser/src/test/kotlin/io/openapiparser/model/v3x/DiscriminatorSpec.kt @@ -13,17 +13,20 @@ import io.kotest.matchers.shouldBe import io.openapiprocessor.jsonschema.converter.NoValueException import io.openapiparser.model.v30.discriminator as discriminator30 import io.openapiparser.model.v31.discriminator as discriminator31 +import io.openapiparser.model.v32.discriminator as discriminator32 class DiscriminatorSpec : StringSpec({ "gets discriminator propertyName" { discriminator30("propertyName: foo").propertyName shouldBe "foo" discriminator31("propertyName: foo").propertyName shouldBe "foo" + discriminator32("propertyName: foo").propertyName shouldBe "foo" } "gets discriminator propertyName throws if it is missing" { shouldThrow { discriminator30().propertyName } shouldThrow { discriminator31().propertyName } + shouldThrow { discriminator32().propertyName } } "gets discriminator mapping" { @@ -39,10 +42,15 @@ class DiscriminatorSpec : StringSpec({ val d31 = discriminator31(source).mapping d31.shouldNotBeNull() d31.size shouldBe 1 + + val d32 = discriminator32(source).mapping + d32.shouldNotBeNull() + d32.size shouldBe 1 } "gets discriminator mapping is empty if it is missing" { discriminator30().mapping.shouldBeEmpty() discriminator31().mapping.shouldBeEmpty() + discriminator32().mapping.shouldBeEmpty() } }) diff --git a/openapi-parser/src/test/kotlin/io/openapiparser/model/v3x/EncodingSpec.kt b/openapi-parser/src/test/kotlin/io/openapiparser/model/v3x/EncodingSpec.kt index be7df0e6..185939e5 100644 --- a/openapi-parser/src/test/kotlin/io/openapiparser/model/v3x/EncodingSpec.kt +++ b/openapi-parser/src/test/kotlin/io/openapiparser/model/v3x/EncodingSpec.kt @@ -12,12 +12,14 @@ import io.kotest.matchers.nulls.shouldNotBeNull import io.kotest.matchers.shouldBe import io.openapiparser.model.v30.encoding as encoding30 import io.openapiparser.model.v31.encoding as encoding31 +import io.openapiparser.model.v32.encoding as encoding32 class EncodingSpec: StringSpec({ "gets encoding content type" { encoding30("contentType: application/json").contentType shouldBe "application/json" encoding31("contentType: application/json").contentType shouldBe "application/json" + encoding32("contentType: application/json").contentType shouldBe "application/json" } /* todo default values @@ -52,27 +54,32 @@ class EncodingSpec: StringSpec({ "gets encoding headers" { encoding30("headers: { X-Foo: {}}").headers["X-Foo"].shouldNotBeNull() encoding31("headers: { X-Foo: {}}").headers["X-Foo"].shouldNotBeNull() + encoding32("headers: { X-Foo: {}}").headers["X-Foo"].shouldNotBeNull() } "gets encoding headers is empty if missing" { encoding30().headers.isEmpty() encoding31().headers.isEmpty() + encoding32().headers.isEmpty() } // not sure if style is correct ... "gets encoding style" { encoding30("style: form").style shouldBe "form" encoding31("style: form").style shouldBe "form" + encoding32("style: form").style shouldBe "form" } "gets encoding style default if missing" { encoding30().style shouldBe "form" encoding31().style shouldBe "form" + encoding32().style shouldBe "form" } "gets parameter explode" { encoding30("explode: true").explode shouldBe true encoding31("explode: true").explode shouldBe true + encoding32("explode: true").explode shouldBe true } "gets parameter explode is default if missing" { @@ -80,19 +87,23 @@ class EncodingSpec: StringSpec({ encoding30("style: simple").explode.shouldBeFalse() encoding31("style: form").explode.shouldBeTrue() encoding31("style: simple").explode.shouldBeFalse() + encoding32("style: form").explode.shouldBeTrue() + encoding32("style: simple").explode.shouldBeFalse() } "gets parameter allowReserved" { encoding30("allowReserved: true").allowReserved.shouldBeTrue() encoding31("allowReserved: true").allowReserved.shouldBeTrue() + encoding32("allowReserved: true").allowReserved.shouldBeTrue() } "gets parameter allowReserved is false if missing" { encoding30().allowReserved.shouldBeFalse() encoding31().allowReserved.shouldBeFalse() + encoding32().allowReserved.shouldBeFalse() } include(testExtensions("encoding 30", ::encoding30) { it.extensions }) include(testExtensions("encoding 31", ::encoding31) { it.extensions }) + include(testExtensions("encoding 32", ::encoding32) { it.extensions }) }) - diff --git a/openapi-parser/src/test/kotlin/io/openapiparser/model/v3x/ExampleSpec.kt b/openapi-parser/src/test/kotlin/io/openapiparser/model/v3x/ExampleSpec.kt index 1cbffe62..40517010 100644 --- a/openapi-parser/src/test/kotlin/io/openapiparser/model/v3x/ExampleSpec.kt +++ b/openapi-parser/src/test/kotlin/io/openapiparser/model/v3x/ExampleSpec.kt @@ -11,42 +11,51 @@ import io.kotest.matchers.nulls.shouldNotBeNull import io.kotest.matchers.shouldBe import io.openapiparser.model.v30.example as example30 import io.openapiparser.model.v31.example as example31 +import io.openapiparser.model.v32.example as example32 class ExampleSpec: StringSpec({ "gets example summary" { example30("summary: a summary").summary shouldBe "a summary" example31("summary: a summary").summary shouldBe "a summary" + example32("summary: a summary").summary shouldBe "a summary" } "gets example summary is null if missing" { example30().summary.shouldBeNull() example31().summary.shouldBeNull() + example32().summary.shouldBeNull() } include(testDescription("example 30", ::example30) { it.description }) include(testDescription("example 31", ::example31) { it.description }) + include(testDescription("example 32", ::example32) { it.description }) "gets example value" { example30("value: {}").value.shouldNotBeNull() example31("value: {}").value.shouldNotBeNull() + example32("value: {}").value.shouldNotBeNull() } "gets example value is null if missing" { example30().value.shouldBeNull() example31().value.shouldBeNull() + example32().value.shouldBeNull() } "gets example external value" { example30("externalValue: url").externalValue shouldBe "url" example31("externalValue: url").externalValue shouldBe "url" + example32("externalValue: url").externalValue shouldBe "url" } "gets example external value is null if missing" { example30().externalValue.shouldBeNull() example31().externalValue.shouldBeNull() + example32().externalValue.shouldBeNull() } include(testExtensions("example 30", ::example30) { it.extensions }) include(testExtensions("example 31", ::example31) { it.extensions }) + include(testExtensions("example 32", ::example32) { it.extensions }) }) diff --git a/openapi-parser/src/test/kotlin/io/openapiparser/model/v3x/ExternalDocumentationSpec.kt b/openapi-parser/src/test/kotlin/io/openapiparser/model/v3x/ExternalDocumentationSpec.kt index 1a5c92bd..0648c993 100644 --- a/openapi-parser/src/test/kotlin/io/openapiparser/model/v3x/ExternalDocumentationSpec.kt +++ b/openapi-parser/src/test/kotlin/io/openapiparser/model/v3x/ExternalDocumentationSpec.kt @@ -11,22 +11,27 @@ import io.kotest.matchers.shouldBe import io.openapiprocessor.jsonschema.converter.NoValueException import io.openapiparser.model.v30.externalDocumentation as externalDocumentation30 import io.openapiparser.model.v31.externalDocumentation as externalDocumentation31 +import io.openapiparser.model.v32.externalDocumentation as externalDocumentation32 class ExternalDocumentationSpec: StringSpec({ include(testDescription("externalDocumentation 30", ::externalDocumentation30) { it.description }) include(testDescription("externalDocumentation 31", ::externalDocumentation31) { it.description }) + include(testDescription("externalDocumentation 32", ::externalDocumentation32) { it.description }) "gets externalDocumentation url" { externalDocumentation30("url: https://a.url").url shouldBe "https://a.url" externalDocumentation31("url: https://a.url").url shouldBe "https://a.url" + externalDocumentation32("url: https://a.url").url shouldBe "https://a.url" } "gets externalDocumentation url throws if it is missing" { shouldThrow { externalDocumentation30().url } shouldThrow { externalDocumentation31().url } + shouldThrow { externalDocumentation32().url } } include(testExtensions("externalDocumentation 30", ::externalDocumentation30) { it.extensions }) include(testExtensions("externalDocumentation 31", ::externalDocumentation31) { it.extensions }) + include(testExtensions("externalDocumentation 32", ::externalDocumentation32) { it.extensions }) }) diff --git a/openapi-parser/src/test/kotlin/io/openapiparser/model/v3x/HeaderSpec.kt b/openapi-parser/src/test/kotlin/io/openapiparser/model/v3x/HeaderSpec.kt index f887f7a6..d29661a6 100644 --- a/openapi-parser/src/test/kotlin/io/openapiparser/model/v3x/HeaderSpec.kt +++ b/openapi-parser/src/test/kotlin/io/openapiparser/model/v3x/HeaderSpec.kt @@ -19,22 +19,29 @@ import io.openapiparser.model.v30.header as header30 import io.openapiparser.model.v31.Example as Example31 import io.openapiparser.model.v31.MediaType as MediaType31 import io.openapiparser.model.v31.header as header31 +import io.openapiparser.model.v32.Example as Example32 +import io.openapiparser.model.v32.MediaType as MediaType32 +import io.openapiparser.model.v32.header as header32 class HeaderSpec: StringSpec({ include(testDescription("header 30", ::header30) { it.description }) include(testDescription("header 31", ::header31) { it.description }) + include(testDescription("header 32", ::header32) { it.description }) "gets header required" { header30("required: true").required.shouldBeTrue() header30("required: false").required.shouldBeFalse() header31("required: true").required.shouldBeTrue() header31("required: false").required.shouldBeFalse() + header32("required: true").required.shouldBeTrue() + header32("required: false").required.shouldBeFalse() } "gets header required is false if missing" { + header30().required.shouldBeFalse() header31().required.shouldBeFalse() - header31().required.shouldBeFalse() + header32().required.shouldBeFalse() } "gets header deprecated" { @@ -42,11 +49,14 @@ class HeaderSpec: StringSpec({ header30("deprecated: false").deprecated.shouldBeFalse() header31("deprecated: true").deprecated.shouldBeTrue() header31("deprecated: false").deprecated.shouldBeFalse() + header32("deprecated: true").deprecated.shouldBeTrue() + header32("deprecated: false").deprecated.shouldBeFalse() } "gets header deprecated is false if missing" { header30().deprecated.shouldBeFalse() header31().deprecated.shouldBeFalse() + header32().deprecated.shouldBeFalse() } "gets header allowEmptyValue" { @@ -54,61 +64,74 @@ class HeaderSpec: StringSpec({ header30("allowEmptyValue: false").allowEmptyValue.shouldBeFalse() header31("allowEmptyValue: true").allowEmptyValue.shouldBeTrue() header31("allowEmptyValue: false").allowEmptyValue.shouldBeFalse() + header32("allowEmptyValue: true").allowEmptyValue.shouldBeTrue() + header32("allowEmptyValue: false").allowEmptyValue.shouldBeFalse() } "gets header allowEmptyValue is false if missing" { header30().allowEmptyValue.shouldBeFalse() header31().allowEmptyValue.shouldBeFalse() + header32().allowEmptyValue.shouldBeFalse() } "gets header style" { header30("style: simple").style shouldBe "simple" header31("style: simple").style shouldBe "simple" + header32("style: simple").style shouldBe "simple" } "gets header style is default if missing" { header30().style shouldBe "simple" header31().style shouldBe "simple" + header32().style shouldBe "simple" } "gets header explode" { header30("explode: true").explode shouldBe true header31("explode: true").explode shouldBe true + header32("explode: true").explode shouldBe true } "gets header explode is default if missing" { header30("style: simple").explode.shouldBeFalse() header31("style: simple").explode.shouldBeFalse() + header32("style: simple").explode.shouldBeFalse() } "gets header allowReserved" { header30("allowReserved: true").allowReserved.shouldBeTrue() header31("allowReserved: true").allowReserved.shouldBeTrue() + header32("allowReserved: true").allowReserved.shouldBeTrue() } "gets header allowReserved is false if missing" { header30().allowReserved.shouldBeFalse() header31().allowReserved.shouldBeFalse() + header32().allowReserved.shouldBeFalse() } "gets header schema" { header30("schema: {}").schema.shouldNotBeNull() header31("schema: {}").schema.shouldNotBeNull() + header32("schema: {}").schema.shouldNotBeNull() } "gets header schema is null if missing" { header30().schema.shouldBeNull() header31().schema.shouldBeNull() + header32().schema.shouldBeNull() } "gets header example" { header30("example: {}").example.shouldNotBeNull() header31("example: {}").example.shouldNotBeNull() + header32("example: {}").example.shouldNotBeNull() } "gets header example is null if missing" { header30().example.shouldBeNull() header31().example.shouldBeNull() + header32().example.shouldBeNull() } "gets header examples 30" { @@ -141,6 +164,21 @@ class HeaderSpec: StringSpec({ examples["bar"].shouldBeInstanceOf() } + "gets header examples 32" { + val source = """ + examples: + foo: {} + bar: {} + """ + + val examples = header32(source).examples + + examples.shouldNotBeNull() + examples.size shouldBe 2 + examples["foo"].shouldBeInstanceOf() + examples["bar"].shouldBeInstanceOf() + } + "gets header examples is empty if missing" { header30().examples.shouldBeEmpty() header31().examples.shouldBeEmpty() @@ -176,11 +214,28 @@ class HeaderSpec: StringSpec({ content["application/xml"].shouldBeInstanceOf() } + "gets header content 32" { + val source = """ + content: + application/json: {} + application/xml: {} + """ + + val content = header32(source).content + + content.shouldNotBeNull() + content.size shouldBe 2 + content["application/json"].shouldBeInstanceOf() + content["application/xml"].shouldBeInstanceOf() + } + "gets header content is empty if missing" { header30().content.shouldBeEmpty() header31().content.shouldBeEmpty() + header32().content.shouldBeEmpty() } include(testExtensions("header30", ::header30) { it.extensions }) include(testExtensions("header31", ::header31) { it.extensions }) + include(testExtensions("header32", ::header32) { it.extensions }) }) diff --git a/openapi-parser/src/test/kotlin/io/openapiparser/model/v3x/InfoSpec.kt b/openapi-parser/src/test/kotlin/io/openapiparser/model/v3x/InfoSpec.kt index 523d962d..999fb6e7 100644 --- a/openapi-parser/src/test/kotlin/io/openapiparser/model/v3x/InfoSpec.kt +++ b/openapi-parser/src/test/kotlin/io/openapiparser/model/v3x/InfoSpec.kt @@ -13,62 +13,75 @@ import io.kotest.matchers.shouldBe import io.openapiprocessor.jsonschema.converter.NoValueException import io.openapiparser.model.v30.info as info30 import io.openapiparser.model.v31.info as info31 +import io.openapiparser.model.v32.info as info32 class InfoSpec: StringSpec({ "gets info title" { info30("title: the title").title shouldBe "the title" info31("title: the title").title shouldBe "the title" + info32("title: the title").title shouldBe "the title" } "gets info title throws if it is missing" { shouldThrow { info30().title } shouldThrow { info31().title } + shouldThrow { info32().title } } "gets info version" { info30("""version: "1"""").version shouldBe "1" info31("""version: "1"""").version shouldBe "1" + info32("""version: "1"""").version shouldBe "1" } "gets info version throws if it is missing" { shouldThrow { info30().version } shouldThrow { info31().version } + shouldThrow { info32().version } } include(testDescription("info 30", ::info30) { it.description }) include(testDescription("info 31", ::info31) { it.description }) + include(testDescription("info 32", ::info32) { it.description }) "gets info terms of service" { info30("termsOfService: https://any/terms").termsOfService shouldBe "https://any/terms" info31("termsOfService: https://any/terms").termsOfService shouldBe "https://any/terms" + info32("termsOfService: https://any/terms").termsOfService shouldBe "https://any/terms" } "gets info terms of service is null if missing" { info30().termsOfService.shouldBeNull() info31().termsOfService.shouldBeNull() + info32().termsOfService.shouldBeNull() } "gets contact object" { info30("contact: {}").contact.shouldNotBeNull() info31("contact: {}").contact.shouldNotBeNull() + info32("contact: {}").contact.shouldNotBeNull() } "gets contact object is null if missing" { info30().contact.shouldBeNull() info31().contact.shouldBeNull() + info32().contact.shouldBeNull() } "gets license object" { info30("license: {}").license.shouldNotBeNull() info31("license: {}").license.shouldNotBeNull() + info32("license: {}").license.shouldNotBeNull() } "gets license object is null if missing" { info30().license.shouldBeNull() info31().license.shouldBeNull() + info32().license.shouldBeNull() } include(testExtensions("Info30", ::info30) { it.extensions }) - include(testExtensions("Info31", ::info30) { it.extensions }) + include(testExtensions("Info31", ::info31) { it.extensions }) + include(testExtensions("Info32", ::info32) { it.extensions }) }) diff --git a/openapi-parser/src/test/kotlin/io/openapiparser/model/v3x/LicenseSpec.kt b/openapi-parser/src/test/kotlin/io/openapiparser/model/v3x/LicenseSpec.kt index eb9e4430..84470009 100644 --- a/openapi-parser/src/test/kotlin/io/openapiparser/model/v3x/LicenseSpec.kt +++ b/openapi-parser/src/test/kotlin/io/openapiparser/model/v3x/LicenseSpec.kt @@ -12,29 +12,35 @@ import io.kotest.matchers.shouldBe import io.openapiprocessor.jsonschema.converter.NoValueException import io.openapiparser.model.v30.license as license30 import io.openapiparser.model.v31.license as license31 +import io.openapiparser.model.v32.license as license32 class LicenseSpec: StringSpec({ "gets license name" { license30("name: license name").name shouldBe "license name" license31("name: license name").name shouldBe "license name" + license32("name: license name").name shouldBe "license name" } "gets license name throws if it missing" { shouldThrow { license30().name } shouldThrow { license31().name } + shouldThrow { license32().name } } "gets license url" { license30("url: https://license").url shouldBe "https://license" license31("url: https://license").url shouldBe "https://license" + license32("url: https://license").url shouldBe "https://license" } "gets license url is null if missing" { license30().url.shouldBeNull() license31().url.shouldBeNull() + license32().url.shouldBeNull() } include(testExtensions("License30", ::license30) { it.extensions }) include(testExtensions("License31", ::license31) { it.extensions }) + include(testExtensions("License32", ::license32) { it.extensions }) }) diff --git a/openapi-parser/src/test/kotlin/io/openapiparser/model/v3x/MediaTypeSpec.kt b/openapi-parser/src/test/kotlin/io/openapiparser/model/v3x/MediaTypeSpec.kt index 65885d6f..353ded84 100644 --- a/openapi-parser/src/test/kotlin/io/openapiparser/model/v3x/MediaTypeSpec.kt +++ b/openapi-parser/src/test/kotlin/io/openapiparser/model/v3x/MediaTypeSpec.kt @@ -17,27 +17,34 @@ import io.openapiparser.model.v30.mediaType as mediaType30 import io.openapiparser.model.v31.Encoding as Encoding31 import io.openapiparser.model.v31.Example as Example31 import io.openapiparser.model.v31.mediaType as mediaType31 +import io.openapiparser.model.v32.Encoding as Encoding32 +import io.openapiparser.model.v32.Example as Example32 +import io.openapiparser.model.v32.mediaType as mediaType32 class MediaTypeSpec: StringSpec({ "gets media type schema" { mediaType30("schema: {}").schema.shouldNotBeNull() mediaType31("schema: {}").schema.shouldNotBeNull() + mediaType32("schema: {}").schema.shouldNotBeNull() } "gets media type schema is null if missing" { mediaType30().schema.shouldBeNull() mediaType31().schema.shouldBeNull() + mediaType32().schema.shouldBeNull() } "gets media type example" { mediaType30("example: {}").example.shouldNotBeNull() mediaType31("example: {}").example.shouldNotBeNull() + mediaType32("example: {}").example.shouldNotBeNull() } "gets media type example is null if missing" { mediaType30().example.shouldBeNull() mediaType31().example.shouldBeNull() + mediaType32().example.shouldBeNull() } "gets media type examples 30" { @@ -70,9 +77,25 @@ class MediaTypeSpec: StringSpec({ examples["bar"].shouldBeInstanceOf() } + "gets media type examples 32" { + val source = """ + examples: + foo: {} + bar: {} + """ + + val examples = mediaType32(source).examples + + examples.shouldNotBeNull() + examples.size shouldBe 2 + examples["foo"].shouldBeInstanceOf() + examples["bar"].shouldBeInstanceOf() + } + "gets parameter examples is empty if missing" { mediaType30().examples.shouldBeEmpty() mediaType31().examples.shouldBeEmpty() + mediaType32().examples.shouldBeEmpty() } "gets media type encoding 30" { @@ -105,11 +128,28 @@ class MediaTypeSpec: StringSpec({ encoding["bar"].shouldBeInstanceOf() } + "gets media type encoding 32" { + val source = """ + encoding: + foo: {} + bar: {} + """ + + val encoding = mediaType32(source).encoding + + encoding.shouldNotBeNull() + encoding.size shouldBe 2 + encoding["foo"].shouldBeInstanceOf() + encoding["bar"].shouldBeInstanceOf() + } + "gets media type encoding is empty if missing" { mediaType30().encoding.shouldBeEmpty() mediaType31().encoding.shouldBeEmpty() + mediaType32().encoding.shouldBeEmpty() } include(testExtensions("mediaType30", ::mediaType30) { it.extensions }) include(testExtensions("mediaType31", ::mediaType31) { it.extensions }) + include(testExtensions("mediaType32", ::mediaType32) { it.extensions }) }) diff --git a/openapi-parser/src/test/kotlin/io/openapiparser/model/v3x/OpenApiSpec.kt b/openapi-parser/src/test/kotlin/io/openapiparser/model/v3x/OpenApiSpec.kt index 6f141ede..0dfefc4f 100644 --- a/openapi-parser/src/test/kotlin/io/openapiparser/model/v3x/OpenApiSpec.kt +++ b/openapi-parser/src/test/kotlin/io/openapiparser/model/v3x/OpenApiSpec.kt @@ -14,28 +14,33 @@ import io.kotest.matchers.nulls.shouldNotBeNull import io.kotest.matchers.shouldBe import io.openapiprocessor.jsonschema.converter.NoValueException import io.openapiparser.model.v30.openapi as openapi30 -import io.openapiparser.model.v31.openapi as openapi31 +import io.openapiparser.model.v30.openapi as openapi31 +import io.openapiparser.model.v31.openapi as openapi32 class OpenApiSpec: StringSpec({ "gets openapi version" { openapi30("openapi: 3.0.3").openapi shouldBe "3.0.3" - openapi31("openapi: 3.1.0").openapi shouldBe "3.1.0" + openapi31("openapi: 3.1.1").openapi shouldBe "3.1.1" + openapi32("openapi: 3.2.0").openapi shouldBe "3.2.0" } "gets openapi version throws if it is missing" { shouldThrow { openapi30().openapi } shouldThrow { openapi31().openapi } + shouldThrow { openapi32().openapi } } "gets info object" { openapi30("info: {}").info.shouldNotBeNull() openapi31("info: {}").info.shouldNotBeNull() + openapi32("info: {}").info.shouldNotBeNull() } "gets info object throws if it missing" { shouldThrow { openapi30().info } - shouldThrow { openapi30().info } + shouldThrow { openapi31().info } + shouldThrow { openapi32().info } } "gets server objects" { @@ -46,11 +51,16 @@ class OpenApiSpec: StringSpec({ val s31 = openapi31("servers: [{}, {}]").servers s31.shouldNotBeNull() s31.size shouldBe 2 + + val s32 = openapi32("servers: [{}, {}]").servers + s32.shouldNotBeNull() + s32.size shouldBe 2 } "gets empty server objects if it is missing" { openapi30().servers.shouldBeEmpty() openapi31().servers.shouldBeEmpty() + openapi32().servers.shouldBeEmpty() } "gets components objects" { @@ -62,11 +72,13 @@ class OpenApiSpec: StringSpec({ openapi30(source).components.shouldNotBeNull() openapi31(source).components.shouldNotBeNull() + openapi32(source).components.shouldNotBeNull() } "gets components is null if it missing" { openapi30().components.shouldBeNull() openapi31().components.shouldBeNull() + openapi32().components.shouldBeNull() } "gets security requirements objects" { @@ -77,11 +89,16 @@ class OpenApiSpec: StringSpec({ val s31 = openapi31("security: [{}, {}]").security s31.shouldNotBeNull() s31.size shouldBe 2 + + val s32 = openapi32("security: [{}, {}]").security + s32.shouldNotBeNull() + s32.size shouldBe 2 } "gets empty security requirements objects if it is missing" { openapi30().security.shouldBeEmpty() openapi31().security.shouldBeEmpty() + openapi32().security.shouldBeEmpty() } "gets tags array" { @@ -92,23 +109,31 @@ class OpenApiSpec: StringSpec({ val t31 = openapi31("tags: [{}, {}]").tags t31.shouldNotBeEmpty() t31.size shouldBe 2 + + val t32 = openapi32("tags: [{}, {}]").tags + t32.shouldNotBeEmpty() + t32.size shouldBe 2 } "gets empty tag objects if it is missing" { openapi30().tags.shouldBeEmpty() openapi31().tags.shouldBeEmpty() + openapi32().tags.shouldBeEmpty() } "gets external docs object" { openapi30("externalDocs: {}").externalDocs.shouldNotBeNull() openapi31("externalDocs: {}").externalDocs.shouldNotBeNull() + openapi32("externalDocs: {}").externalDocs.shouldNotBeNull() } "gets external docs object is null if it missing" { openapi30().externalDocs.shouldBeNull() openapi31().externalDocs.shouldBeNull() + openapi32().externalDocs.shouldBeNull() } include(testExtensions("Openapi30", ::openapi30) { it.extensions }) include(testExtensions("Openapi31", ::openapi31) { it.extensions }) + include(testExtensions("Openapi32", ::openapi32) { it.extensions }) }) diff --git a/openapi-parser/src/test/kotlin/io/openapiparser/model/v3x/OperationSpec.kt b/openapi-parser/src/test/kotlin/io/openapiparser/model/v3x/OperationSpec.kt index 6567d3bb..747d2fef 100644 --- a/openapi-parser/src/test/kotlin/io/openapiparser/model/v3x/OperationSpec.kt +++ b/openapi-parser/src/test/kotlin/io/openapiparser/model/v3x/OperationSpec.kt @@ -16,50 +16,60 @@ import io.kotest.matchers.nulls.shouldNotBeNull import io.kotest.matchers.shouldBe import io.openapiparser.model.v30.operation as operation30 import io.openapiparser.model.v31.operation as operation31 +import io.openapiparser.model.v31.operation as operation32 class OperationSpec: StringSpec({ "gets operation tags" { operation30("tags: [foo, bar]").tags.shouldContainExactly("foo", "bar") operation31("tags: [foo, bar]").tags.shouldContainExactly("foo", "bar") + operation32("tags: [foo, bar]").tags.shouldContainExactly("foo", "bar") } "gets operation tags is empty if missing" { operation30().tags.isEmpty() operation31().tags.isEmpty() + operation32().tags.isEmpty() } "gets operation summary" { operation30("summary: a summary").summary shouldBe "a summary" operation31("summary: a summary").summary shouldBe "a summary" + operation32("summary: a summary").summary shouldBe "a summary" } "gets operation summary is null if missing" { operation30().summary.shouldBeNull() operation31().summary.shouldBeNull() + operation32().summary.shouldBeNull() } include(testDescription("operation 30", ::operation30) { it.description }) - include(testDescription("operation 31", ::operation30) { it.description }) + include(testDescription("operation 31", ::operation31) { it.description }) + include(testDescription("operation 32", ::operation32) { it.description }) "gets operation external docs object" { operation30("externalDocs: {}").externalDocs.shouldNotBeNull() operation31("externalDocs: {}").externalDocs.shouldNotBeNull() + operation32("externalDocs: {}").externalDocs.shouldNotBeNull() } "gets operation external docs object is null if it missing" { operation30().externalDocs.shouldBeNull() operation31().externalDocs.shouldBeNull() + operation32().externalDocs.shouldBeNull() } "gets operation operationId" { operation30("operationId: anId").operationId shouldBe "anId" operation31("operationId: anId").operationId shouldBe "anId" + operation32("operationId: anId").operationId shouldBe "anId" } "gets operation operationId is null if missing" { operation30().operationId.shouldBeNull() operation31().operationId.shouldBeNull() + operation32().operationId.shouldBeNull() } "gets operation parameters" { @@ -67,21 +77,25 @@ class OperationSpec: StringSpec({ operation30(source).parameters.size shouldBe 2 operation31(source).parameters.size shouldBe 2 + operation32(source).parameters.size shouldBe 2 } "gets operation parameters is empty if missing" { operation30().parameters.shouldBeEmpty() operation31().parameters.shouldBeEmpty() + operation32().parameters.shouldBeEmpty() } "gets operation requestBody" { operation30("requestBody: {}").requestBody.shouldNotBeNull() operation31("requestBody: {}").requestBody.shouldNotBeNull() + operation32("requestBody: {}").requestBody.shouldNotBeNull() } "gets operation requestBody is null if it missing" { operation30().requestBody.shouldBeNull() operation31().requestBody.shouldBeNull() + operation32().requestBody.shouldBeNull() } "gets operation callbacks" { @@ -100,11 +114,17 @@ class OperationSpec: StringSpec({ c31.size shouldBe 2 c31["foo"].shouldNotBeNull() c31["bar"].shouldNotBeNull() + + val c32 = operation32(source).callbacks + c32.size shouldBe 2 + c32["foo"].shouldNotBeNull() + c32["bar"].shouldNotBeNull() } "gets operation callbacks is empty if missing" { operation30().callbacks.shouldBeEmpty() operation31().callbacks.shouldBeEmpty() + operation32().callbacks.shouldBeEmpty() } "gets operation deprecated" { @@ -112,11 +132,14 @@ class OperationSpec: StringSpec({ operation30("deprecated: false").deprecated.shouldBeFalse() operation31("deprecated: true").deprecated.shouldBeTrue() operation31("deprecated: false").deprecated.shouldBeFalse() + operation32("deprecated: true").deprecated.shouldBeTrue() + operation32("deprecated: false").deprecated.shouldBeFalse() } "gets operation deprecated is false if missing" { operation30().deprecated.shouldBeFalse() operation31().deprecated.shouldBeFalse() + operation32().deprecated.shouldBeFalse() } "gets operation security requirements" { @@ -127,11 +150,16 @@ class OperationSpec: StringSpec({ val s31 = operation31("security: [{}, {}]").security s31.shouldNotBeNull() s31.size shouldBe 2 + + val s32 = operation31("security: [{}, {}]").security + s32.shouldNotBeNull() + s32.size shouldBe 2 } "gets operation empty security requirements if it is missing" { operation30().security.shouldBeEmpty() operation31().security.shouldBeEmpty() + operation32().security.shouldBeEmpty() } "gets server objects" { @@ -142,10 +170,15 @@ class OperationSpec: StringSpec({ val s31 = operation31("servers: [{}, {}]").servers s31.shouldNotBeNull() s31.size shouldBe 2 + + val s32 = operation31("servers: [{}, {}]").servers + s32.shouldNotBeNull() + s32.size shouldBe 2 } "gets empty server objects if it is missing" { operation30().servers.shouldBeEmpty() operation31().servers.shouldBeEmpty() + operation32().servers.shouldBeEmpty() } }) diff --git a/openapi-parser/src/test/kotlin/io/openapiparser/model/v3x/ParameterSpec.kt b/openapi-parser/src/test/kotlin/io/openapiparser/model/v3x/ParameterSpec.kt index 29d19d6d..c6ee13c4 100644 --- a/openapi-parser/src/test/kotlin/io/openapiparser/model/v3x/ParameterSpec.kt +++ b/openapi-parser/src/test/kotlin/io/openapiparser/model/v3x/ParameterSpec.kt @@ -21,42 +21,53 @@ import io.openapiparser.model.v30.parameter as parameter30 import io.openapiparser.model.v31.Example as Example31 import io.openapiparser.model.v31.MediaType as MediaType31 import io.openapiparser.model.v31.parameter as parameter31 +import io.openapiparser.model.v32.Example as Example32 +import io.openapiparser.model.v32.MediaType as MediaType32 +import io.openapiparser.model.v32.parameter as parameter32 class ParameterSpec: StringSpec({ "gets parameter name" { parameter30("name: aName").name shouldBe "aName" parameter31("name: aName").name shouldBe "aName" + parameter32("name: aName").name shouldBe "aName" } "gets parameter name throws if it is missing" { shouldThrow { parameter30().name } shouldThrow { parameter31().name } + shouldThrow { parameter32().name } } "gets parameter in" { parameter30("in: inType").`in` shouldBe "inType" parameter31("in: inType").`in` shouldBe "inType" + parameter32("in: inType").`in` shouldBe "inType" } "gets parameter in throws if it is missing" { shouldThrow { parameter30().`in` } shouldThrow { parameter31().`in` } + shouldThrow { parameter32().`in` } } include(testDescription("parameter 30", ::parameter30) { it.description }) include(testDescription("parameter 31", ::parameter31) { it.description }) + include(testDescription("parameter 32", ::parameter32) { it.description }) "gets parameter required" { parameter30("required: true").required.shouldBeTrue() parameter30("required: false").required.shouldBeFalse() parameter31("required: true").required.shouldBeTrue() parameter31("required: false").required.shouldBeFalse() + parameter32("required: true").required.shouldBeTrue() + parameter32("required: false").required.shouldBeFalse() } "gets parameter required is false if missing" { parameter30().required.shouldBeFalse() parameter31().required.shouldBeFalse() + parameter32().required.shouldBeFalse() } "gets parameter deprecated" { @@ -64,11 +75,14 @@ class ParameterSpec: StringSpec({ parameter30("deprecated: false").deprecated.shouldBeFalse() parameter31("deprecated: true").deprecated.shouldBeTrue() parameter31("deprecated: false").deprecated.shouldBeFalse() + parameter32("deprecated: true").deprecated.shouldBeTrue() + parameter32("deprecated: false").deprecated.shouldBeFalse() } "gets parameter deprecated is false if missing" { parameter30().deprecated.shouldBeFalse() parameter31().deprecated.shouldBeFalse() + parameter32().deprecated.shouldBeFalse() } "gets parameter allowEmptyValue" { @@ -76,16 +90,20 @@ class ParameterSpec: StringSpec({ parameter30("allowEmptyValue: false").allowEmptyValue.shouldBeFalse() parameter31("allowEmptyValue: true").allowEmptyValue.shouldBeTrue() parameter31("allowEmptyValue: false").allowEmptyValue.shouldBeFalse() + parameter32("allowEmptyValue: true").allowEmptyValue.shouldBeTrue() + parameter32("allowEmptyValue: false").allowEmptyValue.shouldBeFalse() } "gets parameter allowEmptyValue is false if missing" { parameter30().allowEmptyValue.shouldBeFalse() parameter31().allowEmptyValue.shouldBeFalse() + parameter32().allowEmptyValue.shouldBeFalse() } "gets parameter style" { parameter30("style: a Style").style shouldBe "a Style" parameter31("style: a Style").style shouldBe "a Style" + parameter32("style: a Style").style shouldBe "a Style" } "gets parameter style is default if missing" { @@ -97,11 +115,16 @@ class ParameterSpec: StringSpec({ parameter31("in: cookie").style shouldBe "form" parameter31("in: path").style shouldBe "simple" parameter31("in: header").style shouldBe "simple" + parameter32("in: query").style shouldBe "form" + parameter32("in: cookie").style shouldBe "form" + parameter32("in: path").style shouldBe "simple" + parameter32("in: header").style shouldBe "simple" } "gets parameter explode" { parameter30("explode: true").explode shouldBe true parameter31("explode: true").explode shouldBe true + parameter32("explode: true").explode shouldBe true } "gets parameter explode is default if missing" { @@ -109,36 +132,44 @@ class ParameterSpec: StringSpec({ parameter30("style: simple").explode.shouldBeFalse() parameter31("style: form").explode.shouldBeTrue() parameter31("style: simple").explode.shouldBeFalse() + parameter32("style: form").explode.shouldBeTrue() + parameter32("style: simple").explode.shouldBeFalse() } "gets parameter allowReserved" { parameter30("allowReserved: true").allowReserved.shouldBeTrue() parameter31("allowReserved: true").allowReserved.shouldBeTrue() + parameter32("allowReserved: true").allowReserved.shouldBeTrue() } "gets parameter allowReserved is false if missing" { parameter30().allowReserved.shouldBeFalse() parameter31().allowReserved.shouldBeFalse() + parameter32().allowReserved.shouldBeFalse() } "gets parameter schema" { parameter30("schema: {}").schema.shouldNotBeNull() parameter31("schema: {}").schema.shouldNotBeNull() + parameter32("schema: {}").schema.shouldNotBeNull() } "gets parameter schema is null if missing" { parameter30().schema.shouldBeNull() parameter31().schema.shouldBeNull() + parameter32().schema.shouldBeNull() } "gets parameter example" { parameter30("example: {}").example.shouldNotBeNull() parameter31("example: {}").example.shouldNotBeNull() + parameter32("example: {}").example.shouldNotBeNull() } "gets parameter example is null if missing" { parameter30().example.shouldBeNull() parameter31().example.shouldBeNull() + parameter32().example.shouldBeNull() } "gets parameter examples 30" { @@ -171,9 +202,25 @@ class ParameterSpec: StringSpec({ examples["bar"].shouldBeInstanceOf() } + "gets parameter examples 32" { + val source = """ + examples: + foo: {} + bar: {} + """ + + val examples = parameter32(source).examples + + examples.shouldNotBeNull() + examples.size shouldBe 2 + examples["foo"].shouldBeInstanceOf() + examples["bar"].shouldBeInstanceOf() + } + "gets parameter examples is empty if missing" { parameter30().examples.shouldBeEmpty() parameter31().examples.shouldBeEmpty() + parameter32().examples.shouldBeEmpty() } "gets parameter content 30" { @@ -206,11 +253,28 @@ class ParameterSpec: StringSpec({ content["application/xml"].shouldBeInstanceOf() } + "gets parameter content 32" { + val source = """ + content: + application/json: {} + application/xml: {} + """ + + val content = parameter32(source).content + + content.shouldNotBeNull() + content.size shouldBe 2 + content["application/json"].shouldBeInstanceOf() + content["application/xml"].shouldBeInstanceOf() + } + "gets parameter content is empty if missing" { parameter30().content.shouldBeEmpty() parameter31().content.shouldBeEmpty() + parameter32().content.shouldBeEmpty() } include(testExtensions("parameter30", ::parameter30) { it.extensions }) include(testExtensions("parameter31", ::parameter31) { it.extensions }) + include(testExtensions("parameter32", ::parameter32) { it.extensions }) }) diff --git a/openapi-parser/src/test/kotlin/io/openapiparser/model/v3x/PathItemSpec.kt b/openapi-parser/src/test/kotlin/io/openapiparser/model/v3x/PathItemSpec.kt index 8ab826c5..4919fe14 100644 --- a/openapi-parser/src/test/kotlin/io/openapiparser/model/v3x/PathItemSpec.kt +++ b/openapi-parser/src/test/kotlin/io/openapiparser/model/v3x/PathItemSpec.kt @@ -15,6 +15,8 @@ import io.openapiparser.model.v30.openapi as openapi30 import io.openapiparser.model.v30.pathItem as pathItem30 import io.openapiparser.model.v31.openapi as openapi31 import io.openapiparser.model.v31.pathItem as pathItem31 +import io.openapiparser.model.v32.openapi as openapi32 +import io.openapiparser.model.v32.pathItem as pathItem32 class PathItemSpec: StringSpec({ @@ -30,9 +32,13 @@ class PathItemSpec: StringSpec({ item30.isRef.shouldBeTrue() item30.ref shouldBe "#/path" - val item31 = openapi30(source).paths.getPathItem("/foo")!! + val item31 = openapi31(source).paths?.getPathItem("/foo")!! item31.isRef.shouldBeTrue() item31.ref shouldBe "#/path" + + val item32 = openapi32(source).paths?.getPathItem("/foo")!! + item32.isRef.shouldBeTrue() + item32.ref shouldBe "#/path" } "get path item property from \$ref" { @@ -50,20 +56,26 @@ class PathItemSpec: StringSpec({ val parameter31 = openapi31(source).paths?.getPathItem("/foo")?.parameters?.first() parameter31?.refObject?.name shouldBe "ref name" + + val parameter32 = openapi31(source).paths?.getPathItem("/foo")?.parameters?.first() + parameter32?.refObject?.name shouldBe "ref name" } "gets path item summary" { pathItem30("summary: a summary").summary shouldBe "a summary" pathItem31("summary: a summary").summary shouldBe "a summary" + pathItem32("summary: a summary").summary shouldBe "a summary" } "gets path item summary is null if missing" { pathItem30().summary.shouldBeNull() pathItem31().summary.shouldBeNull() + pathItem32().summary.shouldBeNull() } include(testDescription("path item 30", ::pathItem30) { it.description }) include(testDescription("path item 31", ::pathItem31) { it.description }) + include(testDescription("path item 32", ::pathItem32) { it.description }) // todo operations @@ -75,11 +87,16 @@ class PathItemSpec: StringSpec({ val s31 = pathItem31("servers: [{}, {}]").servers s31.shouldNotBeNull() s31.size shouldBe 2 + + val s32 = pathItem31("servers: [{}, {}]").servers + s32.shouldNotBeNull() + s32.size shouldBe 2 } "gets path item empty server objects if it is missing" { pathItem30().servers.shouldBeEmpty() pathItem31().servers.shouldBeEmpty() + pathItem32().servers.shouldBeEmpty() } "gets path item parameters" { @@ -90,13 +107,19 @@ class PathItemSpec: StringSpec({ val p31 = pathItem31("parameters: [{}, {}]").parameters p31.shouldNotBeNull() p31.size shouldBe 2 + + val p32 = pathItem32("parameters: [{}, {}]").parameters + p32.shouldNotBeNull() + p32.size shouldBe 2 } "gets path item empty parameters objects if it is missing" { pathItem30().parameters.shouldBeEmpty() pathItem31().parameters.shouldBeEmpty() + pathItem32().parameters.shouldBeEmpty() } include(testExtensions("path item 30", ::pathItem30) { it.extensions }) include(testExtensions("path item 31", ::pathItem31) { it.extensions }) + include(testExtensions("path item 32", ::pathItem32) { it.extensions }) }) diff --git a/openapi-parser/src/test/kotlin/io/openapiparser/model/v3x/PathsSpec.kt b/openapi-parser/src/test/kotlin/io/openapiparser/model/v3x/PathsSpec.kt index ada76976..394a639e 100644 --- a/openapi-parser/src/test/kotlin/io/openapiparser/model/v3x/PathsSpec.kt +++ b/openapi-parser/src/test/kotlin/io/openapiparser/model/v3x/PathsSpec.kt @@ -10,6 +10,7 @@ import io.kotest.matchers.nulls.shouldNotBeNull import io.kotest.matchers.shouldBe import io.openapiparser.model.v30.paths as paths30 import io.openapiparser.model.v31.paths as paths31 +import io.openapiparser.model.v32.paths as paths32 class PathsSpec: StringSpec({ @@ -20,6 +21,7 @@ class PathsSpec: StringSpec({ paths30(source).getPathItem("/foo").shouldNotBeNull() paths31(source).getPathItem("/foo").shouldNotBeNull() + paths32(source).getPathItem("/foo").shouldNotBeNull() } "gets path items objects" { @@ -37,8 +39,14 @@ class PathsSpec: StringSpec({ p31.size shouldBe 2 p31["/foo"].shouldNotBeNull() p31["/bar"].shouldNotBeNull() + + val p32 = paths32(source).pathItems + p32.size shouldBe 2 + p32["/foo"].shouldNotBeNull() + p32["/bar"].shouldNotBeNull() } include(testExtensions("Paths30", ::paths30) { it.extensions }) include(testExtensions("Paths31", ::paths31) { it.extensions }) + include(testExtensions("Paths32", ::paths32) { it.extensions }) }) diff --git a/openapi-parser/src/test/kotlin/io/openapiparser/model/v3x/RequestBodySpec.kt b/openapi-parser/src/test/kotlin/io/openapiparser/model/v3x/RequestBodySpec.kt index 3bac4d33..09d99d4f 100644 --- a/openapi-parser/src/test/kotlin/io/openapiparser/model/v3x/RequestBodySpec.kt +++ b/openapi-parser/src/test/kotlin/io/openapiparser/model/v3x/RequestBodySpec.kt @@ -16,6 +16,8 @@ import io.openapiparser.model.v30.MediaType as MediaType30 import io.openapiparser.model.v30.requestBody as requestBody30 import io.openapiparser.model.v31.MediaType as MediaType31 import io.openapiparser.model.v31.requestBody as requestBody31 +import io.openapiparser.model.v32.MediaType as MediaType32 +import io.openapiparser.model.v32.requestBody as requestBody32 class RequestBodySpec: StringSpec ({ @@ -29,9 +31,13 @@ class RequestBodySpec: StringSpec ({ body30.isRef.shouldBeTrue() body30.ref shouldBe "#/body" - val body31 = requestBody30(source) + val body31 = requestBody31(source) body31.isRef.shouldBeTrue() body31.ref shouldBe "#/body" + + val body32 = requestBody32(source) + body32.isRef.shouldBeTrue() + body32.ref shouldBe "#/body" } "get request body from \$ref" { @@ -52,10 +58,14 @@ class RequestBodySpec: StringSpec ({ val body31 = requestBody31(source) body31.refObject.content["application/json"].shouldBeInstanceOf() + + val body32 = requestBody32(source) + body32.refObject.content["application/json"].shouldBeInstanceOf() } include(testDescription("requestBody 30", ::requestBody30) { it.description }) include(testDescription("requestBody 31", ::requestBody31) { it.description }) + include(testDescription("requestBody 32", ::requestBody32) { it.description }) "gets requestBody content 30" { val source = """ @@ -87,9 +97,25 @@ class RequestBodySpec: StringSpec ({ content["application/xml"].shouldBeInstanceOf() } + "gets requestBody content 32" { + val source = """ + content: + application/json: {} + application/xml: {} + """ + + val content = requestBody32(source).content + + content.shouldNotBeNull() + content.size shouldBe 2 + content["application/json"].shouldBeInstanceOf() + content["application/xml"].shouldBeInstanceOf() + } + "gets requestBody content is empty if missing" { requestBody30().content.shouldBeEmpty() requestBody31().content.shouldBeEmpty() + requestBody32().content.shouldBeEmpty() } "gets requestBody required" { @@ -97,13 +123,17 @@ class RequestBodySpec: StringSpec ({ requestBody30("required: false").required.shouldBeFalse() requestBody31("required: true").required.shouldBeTrue() requestBody31("required: false").required.shouldBeFalse() + requestBody32("required: true").required.shouldBeTrue() + requestBody32("required: false").required.shouldBeFalse() } "gets requestBody required is false if missing" { requestBody30().required.shouldBeFalse() requestBody31().required.shouldBeFalse() + requestBody32().required.shouldBeFalse() } include(testExtensions("requestBody 30", ::requestBody30) { it.extensions }) include(testExtensions("requestBody 31", ::requestBody31) { it.extensions }) + include(testExtensions("requestBody 32", ::requestBody32) { it.extensions }) }) diff --git a/openapi-parser/src/test/kotlin/io/openapiparser/model/v3x/ResponseSpec.kt b/openapi-parser/src/test/kotlin/io/openapiparser/model/v3x/ResponseSpec.kt index 27f8733d..598f2233 100644 --- a/openapi-parser/src/test/kotlin/io/openapiparser/model/v3x/ResponseSpec.kt +++ b/openapi-parser/src/test/kotlin/io/openapiparser/model/v3x/ResponseSpec.kt @@ -16,17 +16,21 @@ import io.openapiparser.model.v30.MediaType as MediaType30 import io.openapiparser.model.v30.response as response30 import io.openapiparser.model.v31.MediaType as MediaType31 import io.openapiparser.model.v31.response as response31 +import io.openapiparser.model.v32.MediaType as MediaType32 +import io.openapiparser.model.v32.response as response32 class ResponseSpec: StringSpec({ "gets response description" { response30("description: description").description shouldBe "description" response31("description: description").description shouldBe "description" + response32("description: description").description shouldBe "description" } "gets response description throws if it is missing" { shouldThrow { response30().description } shouldThrow { response31().description } + shouldThrow { response32().description } } "gets response headers" { @@ -45,11 +49,17 @@ class ResponseSpec: StringSpec({ h31.size shouldBe 2 h31["foo"].shouldNotBeNull() h31["bar"].shouldNotBeNull() + + val h32 = response32(source).headers + h32.size shouldBe 2 + h32["foo"].shouldNotBeNull() + h32["bar"].shouldNotBeNull() } "gets response headers is empty if missing" { response30().headers.shouldBeEmpty() response31().headers.shouldBeEmpty() + response32().headers.shouldBeEmpty() } "gets response content 30" { @@ -82,9 +92,25 @@ class ResponseSpec: StringSpec({ content["application/xml"].shouldBeInstanceOf() } + "gets response content 32" { + val source = """ + content: + application/json: {} + application/xml: {} + """ + + val content = response32(source).content + + content.shouldNotBeNull() + content.size shouldBe 2 + content["application/json"].shouldBeInstanceOf() + content["application/xml"].shouldBeInstanceOf() + } + "gets response content is empty if missing" { response30().content.shouldBeEmpty() response31().content.shouldBeEmpty() + response32().content.shouldBeEmpty() } "gets response links" { @@ -103,13 +129,20 @@ class ResponseSpec: StringSpec({ l31.size shouldBe 2 l31["foo"].shouldNotBeNull() l31["bar"].shouldNotBeNull() + + val l32 = response31(source).links + l32.size shouldBe 2 + l32["foo"].shouldNotBeNull() + l32["bar"].shouldNotBeNull() } "gets response links is empty if missing" { response30().links.shouldBeEmpty() response31().links.shouldBeEmpty() + response32().links.shouldBeEmpty() } include(testExtensions("response 30", ::response30) { it.extensions }) include(testExtensions("response 31", ::response31) { it.extensions }) + include(testExtensions("response 32", ::response32) { it.extensions }) }) diff --git a/openapi-parser/src/test/kotlin/io/openapiparser/model/v3x/ResponsesSpec.kt b/openapi-parser/src/test/kotlin/io/openapiparser/model/v3x/ResponsesSpec.kt index 95c403ae..3aab1c32 100644 --- a/openapi-parser/src/test/kotlin/io/openapiparser/model/v3x/ResponsesSpec.kt +++ b/openapi-parser/src/test/kotlin/io/openapiparser/model/v3x/ResponsesSpec.kt @@ -15,17 +15,21 @@ import io.openapiparser.model.v30.Response as Response30 import io.openapiparser.model.v30.responses as responses30 import io.openapiparser.model.v31.Response as Response31 import io.openapiparser.model.v31.responses as responses31 +import io.openapiparser.model.v32.Response as Response32 +import io.openapiparser.model.v32.responses as responses32 class ResponsesSpec: StringSpec({ "gets responses default" { responses30("default: {}").default.shouldNotBeNull() responses31("default: {}").default.shouldNotBeNull() + responses32("default: {}").default.shouldNotBeNull() } "gets responses default is null if missing" { responses30().default.shouldBeNull() responses31().default.shouldBeNull() + responses32().default.shouldBeNull() } "gets responses responses 30" { @@ -54,11 +58,26 @@ class ResponsesSpec: StringSpec({ responses["204"].shouldBeInstanceOf() } + "gets responses responses 32" { + val source = """ + '200': {} + '204': {} + """ + + val responses = responses32(source).responses + responses.shouldNotBeNull() + responses.size shouldBe 2 + responses["200"].shouldBeInstanceOf() + responses["204"].shouldBeInstanceOf() + } + "gets responses responses is empty if missing" { responses30().responses.shouldBeEmpty() responses31().responses.shouldBeEmpty() + responses32().responses.shouldBeEmpty() } include(testExtensions("responses 30", ::responses30) { it.extensions }) include(testExtensions("responses 31", ::responses31) { it.extensions }) + include(testExtensions("responses 32", ::responses32) { it.extensions }) }) diff --git a/openapi-parser/src/test/kotlin/io/openapiparser/model/v3x/SchemaSpec.kt b/openapi-parser/src/test/kotlin/io/openapiparser/model/v3x/SchemaSpec.kt index 2620537d..d2e91bd1 100644 --- a/openapi-parser/src/test/kotlin/io/openapiparser/model/v3x/SchemaSpec.kt +++ b/openapi-parser/src/test/kotlin/io/openapiparser/model/v3x/SchemaSpec.kt @@ -16,6 +16,7 @@ import io.kotest.matchers.nulls.shouldNotBeNull import io.kotest.matchers.shouldBe import io.openapiparser.model.v30.schema as schema30 import io.openapiparser.model.v31.schema as schema31 +import io.openapiparser.model.v32.schema as schema32 class SchemaSpec: StringSpec({ @@ -23,184 +24,221 @@ class SchemaSpec: StringSpec({ "gets schema multipleOf" { schema30("multipleOf: 9.9").multipleOf shouldBe 9.9 schema31("multipleOf: 9.9").multipleOf shouldBe 9.9 + schema32("multipleOf: 9.9").multipleOf shouldBe 9.9 } "gets schema multipleOf is null if missing" { schema30().multipleOf.shouldBeNull() schema31().multipleOf.shouldBeNull() + schema32().multipleOf.shouldBeNull() } "gets schema maximum" { schema30("maximum: 9.9").maximum shouldBe 9.9 schema31("maximum: 9.9").maximum shouldBe 9.9 + schema32("maximum: 9.9").maximum shouldBe 9.9 } "gets schema maximum is null if missing" { schema30().maximum.shouldBeNull() schema31().maximum.shouldBeNull() + schema32().maximum.shouldBeNull() } "gets schema exclusiveMaximum" { schema30("exclusiveMaximum: true").exclusiveMaximum.shouldBeTrue() schema31("exclusiveMaximum: 9.9").exclusiveMaximum shouldBe 9.9 + schema32("exclusiveMaximum: 9.9").exclusiveMaximum shouldBe 9.9 } "gets schema minimum" { schema30("minimum: 9.9").minimum shouldBe 9.9 schema31("minimum: 9.9").minimum shouldBe 9.9 + schema32("minimum: 9.9").minimum shouldBe 9.9 } "gets schema minimum is null if missing" { schema30().minimum.shouldBeNull() schema31().minimum.shouldBeNull() + schema32().minimum.shouldBeNull() } "gets schema exclusiveMinimum" { schema30("exclusiveMinimum: true").exclusiveMinimum.shouldBeTrue() schema31("exclusiveMinimum: 9.9").exclusiveMinimum shouldBe 9.9 + schema32("exclusiveMinimum: 9.9").exclusiveMinimum shouldBe 9.9 } "gets schema maxLength" { schema30("maxLength: 9").maxLength shouldBe 9 schema31("maxLength: 9").maxLength shouldBe 9 + schema32("maxLength: 9").maxLength shouldBe 9 } "gets schema maxLength is null if missing" { schema30().maxLength.shouldBeNull() schema31().maxLength.shouldBeNull() + schema32().maxLength.shouldBeNull() } "gets schema minLength" { schema30("minLength: 9").minLength shouldBe 9 schema31("minLength: 9").minLength shouldBe 9 + schema32("minLength: 9").minLength shouldBe 9 } "gets schema minLength is null if missing" { schema30().minLength.shouldBeNull() schema31().minLength.shouldBeNull() + schema32().minLength.shouldBeNull() } "gets schema pattern" { schema30("pattern: regex").pattern shouldBe "regex" schema31("pattern: regex").pattern shouldBe "regex" + schema32("pattern: regex").pattern shouldBe "regex" } "gets schema pattern is null if missing" { schema30().pattern.shouldBeNull() schema31().pattern.shouldBeNull() + schema32().pattern.shouldBeNull() } "gets schema minItems" { schema30("minItems: 9").minItems shouldBe 9 schema31("minItems: 9").minItems shouldBe 9 + schema32("minItems: 9").minItems shouldBe 9 } "gets schema minItems is 0 if missing" { schema30().minItems shouldBe 0 schema31().minItems shouldBe 0 + schema32().minItems shouldBe 0 } "gets schema maxItems" { schema30("maxItems: 9").maxItems shouldBe 9 schema31("maxItems: 9").maxItems shouldBe 9 + schema32("maxItems: 9").maxItems shouldBe 9 } "gets schema maxItems is null if missing" { schema30().maxItems.shouldBeNull() schema31().maxItems.shouldBeNull() + schema32().maxItems.shouldBeNull() } "gets schema uniqueItems" { schema30("uniqueItems: true").uniqueItems.shouldBeTrue() schema31("uniqueItems: true").uniqueItems.shouldBeTrue() + schema32("uniqueItems: true").uniqueItems.shouldBeTrue() } "gets schema uniqueItems is false if missing" { schema30().uniqueItems.shouldBeFalse() schema31().uniqueItems.shouldBeFalse() + schema32().uniqueItems.shouldBeFalse() } "gets schema minProperties" { schema30("minProperties: 9").minProperties shouldBe 9 schema31("minProperties: 9").minProperties shouldBe 9 + schema32("minProperties: 9").minProperties shouldBe 9 } "gets schema minProperties is 0 if missing" { schema30().minProperties shouldBe 0 schema31().minProperties shouldBe 0 + schema32().minProperties shouldBe 0 } "gets schema maxProperties" { schema30("maxProperties: 9").maxProperties shouldBe 9 schema31("maxProperties: 9").maxProperties shouldBe 9 + schema32("maxProperties: 9").maxProperties shouldBe 9 } "gets schema maxProperties is null if missing" { schema30().maxProperties.shouldBeNull() schema31().maxProperties.shouldBeNull() + schema32().maxProperties.shouldBeNull() } "gets schema required" { schema30("required: [foo, bar]").required.shouldContainExactly(listOf("foo", "bar")) schema31("required: [foo, bar]").required.shouldContainExactly(listOf("foo", "bar")) + schema32("required: [foo, bar]").required.shouldContainExactly(listOf("foo", "bar")) } "gets schema required is empty if missing" { schema30().required.shouldBeEmpty() schema31().required.shouldBeEmpty() + schema32().required.shouldBeEmpty() } "gets schema format" { schema30("format: foo").format shouldBe "foo" schema31("format: foo").format shouldBe "foo" + schema32("format: foo").format shouldBe "foo" } "gets schema format is null if missing" { schema30().format.shouldBeNull() schema31().format.shouldBeNull() + schema32().format.shouldBeNull() } "gets schema enum" { schema30("enum: [foo, bar]").enum shouldBe listOf("foo", "bar") schema31("enum: [foo, bar]").enum shouldBe listOf("foo", "bar") + schema32("enum: [foo, bar]").enum shouldBe listOf("foo", "bar") } "gets schema enum is null if missing" { schema30().enum.shouldBeNull() schema31().enum.shouldBeNull() + schema32().enum.shouldBeNull() } "gets schema title" { schema30("title: foo").title shouldBe "foo" schema31("title: foo").title shouldBe "foo" + schema32("title: foo").title shouldBe "foo" } "gets schema title is null if missing" { schema30().title.shouldBeNull() schema31().title.shouldBeNull() + schema32().title.shouldBeNull() } include(testDescription("schema 30", ::schema30) { it.description }) include(testDescription("schema 31", ::schema31) { it.description }) + include(testDescription("schema 32", ::schema31) { it.description }) "gets schema default" { schema30("default: {}").default.shouldNotBeNull() schema31("default: {}").default.shouldNotBeNull() + schema32("default: {}").default.shouldNotBeNull() } "gets schema default is null if missing" { schema30().default.shouldBeNull() schema31().default.shouldBeNull() + schema32().default.shouldBeNull() } "gets schema deprecated" { schema30("deprecated: true").deprecated.shouldBeTrue() schema31("deprecated: true").deprecated.shouldBeTrue() + schema32("deprecated: true").deprecated.shouldBeTrue() } "gets schema deprecated is false if missing" { schema30().deprecated.shouldBeFalse() schema31().deprecated.shouldBeFalse() + schema32().deprecated.shouldBeFalse() } "gets schema properties" { @@ -219,125 +257,154 @@ class SchemaSpec: StringSpec({ p31.size shouldBe 2 p31["foo"].shouldNotBeNull() p31["bar"].shouldNotBeNull() + + val p32 = schema32(source).properties + p32.size shouldBe 2 + p32["foo"].shouldNotBeNull() + p32["bar"].shouldNotBeNull() } "gets schema properties is empty if missing" { schema30().properties.shouldBeEmpty() schema31().properties.shouldBeEmpty() + schema32().properties.shouldBeEmpty() } - "gets schema items" () { + "gets schema items" { schema30("items: {}").items.shouldNotBeNull() schema31("items: {}").items.shouldNotBeNull() + schema32("items: {}").items.shouldNotBeNull() } - "gets schema items is null if missing" () { + "gets schema items is null if missing" { schema30().items.shouldBeNull() schema31().items.shouldBeNull() + schema32().items.shouldBeNull() } "gets schema allOf" { schema30("allOf: [{}]").allOf.size shouldBe 1 schema31("allOf: [{}]").allOf.size shouldBe 1 + schema32("allOf: [{}]").allOf.size shouldBe 1 } "gets schema allOf is empty if missing" { schema30().allOf.shouldBeEmpty() schema31().allOf.shouldBeEmpty() + schema32().allOf.shouldBeEmpty() } "gets schema anyOf" { schema30("anyOf: [{}]").anyOf.size shouldBe 1 schema31("anyOf: [{}]").anyOf.size shouldBe 1 + schema32("anyOf: [{}]").anyOf.size shouldBe 1 } "gets schema anyOf is empty if missing" { schema30().anyOf.shouldBeEmpty() schema31().anyOf.shouldBeEmpty() + schema32().anyOf.shouldBeEmpty() } "gets schema oneOf" { schema30("oneOf: [{}]").oneOf.size shouldBe 1 schema31("oneOf: [{}]").oneOf.size shouldBe 1 + schema32("oneOf: [{}]").oneOf.size shouldBe 1 } "gets schema oneOf is empty if missing" { schema30().oneOf.shouldBeEmpty() schema31().oneOf.shouldBeEmpty() + schema32().oneOf.shouldBeEmpty() } - "gets schema not" () { + "gets schema not" { schema30("not: {}").not.shouldNotBeNull() schema31("not: {}").not.shouldNotBeNull() + schema32("not: {}").not.shouldNotBeNull() } - "gets schema not is null if missing" () { + "gets schema not is null if missing" { schema30().not.shouldBeNull() schema31().not.shouldBeNull() + schema32().not.shouldBeNull() } "gets schema readOnly" { schema30("readOnly: true").readOnly.shouldBeTrue() schema31("readOnly: true").readOnly.shouldBeTrue() + schema32("readOnly: true").readOnly.shouldBeTrue() } "gets schema readOnly is false if missing" { schema30().readOnly.shouldBeFalse() schema31().readOnly.shouldBeFalse() + schema32().readOnly.shouldBeFalse() } "gets schema writeOnly" { schema30("writeOnly: true").writeOnly.shouldBeTrue() schema31("writeOnly: true").writeOnly.shouldBeTrue() + schema32("writeOnly: true").writeOnly.shouldBeTrue() } "gets schema writeOnly is false if missing" { schema30().writeOnly.shouldBeFalse() schema31().writeOnly.shouldBeFalse() + schema32().writeOnly.shouldBeFalse() } "gets schema externalDocs" { schema30("externalDocs: {}").externalDocs.shouldNotBeNull() schema31("externalDocs: {}").externalDocs.shouldNotBeNull() + schema32("externalDocs: {}").externalDocs.shouldNotBeNull() } "gets schema externalDocs is null if missing" { schema30().externalDocs.shouldBeNull() schema31().externalDocs.shouldBeNull() + schema32().externalDocs.shouldBeNull() } @Suppress("DEPRECATION") "gets schema example" { schema30("example: {}").example.shouldNotBeNull() schema31("example: {}").example.shouldNotBeNull() + schema32("example: {}").example.shouldNotBeNull() } @Suppress("DEPRECATION") "gets schema example is null if missing" { schema30().example.shouldBeNull() schema31().example.shouldBeNull() + schema32().example.shouldBeNull() } "gets schema discriminator" { schema30("discriminator: {}").discriminator.shouldNotBeNull() schema31("discriminator: {}").discriminator.shouldNotBeNull() + schema32("discriminator: {}").discriminator.shouldNotBeNull() } "gets schema discriminator is null if missing" { schema30().discriminator.shouldBeNull() schema31().discriminator.shouldBeNull() + schema32().discriminator.shouldBeNull() } "gets schema xml" { schema30("xml: {}").xml.shouldNotBeNull() schema31("xml: {}").xml.shouldNotBeNull() + schema32("xml: {}").xml.shouldNotBeNull() } "gets schema xml is null if missing" { schema30().xml.shouldBeNull() schema31().xml.shouldBeNull() + schema32().xml.shouldBeNull() } include(testExtensions("schema 30", ::schema30) { it.extensions }) include(testExtensions("schema 31", ::schema31) { it.extensions }) + include(testExtensions("schema 32", ::schema32) { it.extensions }) }) diff --git a/openapi-parser/src/test/kotlin/io/openapiparser/model/v3x/ServerSpec.kt b/openapi-parser/src/test/kotlin/io/openapiparser/model/v3x/ServerSpec.kt index 96c7458e..c6cbc31c 100644 --- a/openapi-parser/src/test/kotlin/io/openapiparser/model/v3x/ServerSpec.kt +++ b/openapi-parser/src/test/kotlin/io/openapiparser/model/v3x/ServerSpec.kt @@ -14,39 +14,47 @@ import io.kotest.matchers.shouldBe import io.openapiprocessor.jsonschema.converter.NoValueException import io.openapiparser.model.v30.server as server30 import io.openapiparser.model.v31.server as server31 +import io.openapiparser.model.v32.server as server32 class ServerSpec: StringSpec({ "gets server url" { server30("url: https://a.url").url shouldBe "https://a.url" server31("url: https://a.url").url shouldBe "https://a.url" + server32("url: https://a.url").url shouldBe "https://a.url" } "gets server url throws if it is missing" { shouldThrow { server30().url } shouldThrow { server31().url } + shouldThrow { server32().url } } "gets server description" { server30("description: a description").description shouldBe "a description" server31("description: a description").description shouldBe "a description" + server32("description: a description").description shouldBe "a description" } "gets server description is null if missing" { server30().description.shouldBeNull() server31().description.shouldBeNull() + server32().description.shouldBeNull() } "gets server variables object" { server30("variables: {}").variables.shouldNotBeNull() server31("variables: {}").variables.shouldNotBeNull() + server32("variables: {}").variables.shouldNotBeNull() } "gets empty variables objects if it is missing" { server30().variables.shouldBeEmpty() server31().variables.shouldBeEmpty() + server32().variables.shouldBeEmpty() } include(testExtensions("Server30", ::server30) { it.extensions }) include(testExtensions("Server31", ::server31) { it.extensions }) + include(testExtensions("Server32", ::server32) { it.extensions }) }) diff --git a/openapi-parser/src/test/kotlin/io/openapiparser/model/v3x/ServerVariableSpec.kt b/openapi-parser/src/test/kotlin/io/openapiparser/model/v3x/ServerVariableSpec.kt index fa7930e7..a389ac17 100644 --- a/openapi-parser/src/test/kotlin/io/openapiparser/model/v3x/ServerVariableSpec.kt +++ b/openapi-parser/src/test/kotlin/io/openapiparser/model/v3x/ServerVariableSpec.kt @@ -13,33 +13,40 @@ import io.kotest.matchers.shouldBe import io.openapiprocessor.jsonschema.converter.NoValueException import io.openapiparser.model.v30.serverVariable as serverVariable30 import io.openapiparser.model.v31.serverVariable as serverVariable31 +import io.openapiparser.model.v32.serverVariable as serverVariable32 class ServerVariableSpec: StringSpec({ "gets server variable enum" { serverVariable30("enum: [one, two]").enum shouldContainExactly (listOf("one", "two")) serverVariable31("enum: [one, two]").enum shouldContainExactly (listOf("one", "two")) + serverVariable32("enum: [one, two]").enum shouldContainExactly (listOf("one", "two")) } "gets empty server variable enum if it is missing" { serverVariable30().enum.shouldBeEmpty() serverVariable31().enum.shouldBeEmpty() + serverVariable32().enum.shouldBeEmpty() } "gets server variable default" { serverVariable30("default: value").default shouldBe "value" serverVariable31("default: value").default shouldBe "value" + serverVariable32("default: value").default shouldBe "value" } "gets server variable default throws if it is missing" { shouldThrow { serverVariable30().default } shouldThrow { serverVariable31().default } + shouldThrow { serverVariable32().default } } include(testDescription("server variable 30", ::serverVariable30) { it.description }) include(testDescription("server variable 31", ::serverVariable31) { it.description }) + include(testDescription("server variable 32", ::serverVariable32) { it.description }) include(testExtensions("server variable 30", ::serverVariable30) { it.extensions }) include(testExtensions("server variable 31", ::serverVariable31) { it.extensions }) + include(testExtensions("server variable 32", ::serverVariable32) { it.extensions }) }) From e3faad77360cfcff7d1607a209a45a58268058da Mon Sep 17 00:00:00 2001 From: Martin Hauner Date: Fri, 5 Sep 2025 11:18:15 +0200 Subject: [PATCH 11/11] add 3.2 checks --- .../openapiparser/model/v31/ComponentsSpec.kt | 23 ++++++---- .../model/v31/DiscriminatorSpec.kt | 6 ++- .../io/openapiparser/model/v31/InfoSpec.kt | 8 +++- .../io/openapiparser/model/v31/LicenseSpec.kt | 8 +++- .../io/openapiparser/model/v31/OpenApi.kt | 15 ++++++ .../io/openapiparser/model/v31/OpenApiSpec.kt | 36 ++++++++++----- .../openapiparser/model/v31/OperationSpec.kt | 9 ++-- .../openapiparser/model/v31/PathItemSpec.kt | 6 ++- .../io/openapiparser/model/v31/SchemaSpec.kt | 46 ++++++++++--------- 9 files changed, 103 insertions(+), 54 deletions(-) create mode 100644 openapi-parser/src/test/kotlin/io/openapiparser/model/v31/OpenApi.kt diff --git a/openapi-parser/src/test/kotlin/io/openapiparser/model/v31/ComponentsSpec.kt b/openapi-parser/src/test/kotlin/io/openapiparser/model/v31/ComponentsSpec.kt index b41650de..dfb6e7cb 100644 --- a/openapi-parser/src/test/kotlin/io/openapiparser/model/v31/ComponentsSpec.kt +++ b/openapi-parser/src/test/kotlin/io/openapiparser/model/v31/ComponentsSpec.kt @@ -9,28 +9,33 @@ import io.kotest.core.spec.style.StringSpec import io.kotest.matchers.maps.shouldBeEmpty import io.kotest.matchers.nulls.shouldNotBeNull import io.kotest.matchers.shouldBe +import io.openapiparser.model.v31.components as components31 +import io.openapiparser.model.v32.components as components32 /** * @see [io.openapiparser.model.v3x.ComponentsSpec] */ class ComponentsSpec: StringSpec ({ + fun assertPathItems (pathItems: Map) { + pathItems.size shouldBe 2 + pathItems["/foo"].shouldNotBeNull() + pathItems["/bar"].shouldNotBeNull() + } + "gets components pathItems" { val source = """ pathItems: - foo: {} - bar: {} + /foo: {} + /bar: {} """ - val pathItems = components(source).pathItems - - pathItems.size shouldBe 2 - pathItems["foo"].shouldNotBeNull() - pathItems["bar"].shouldNotBeNull() + assertPathItems(components31(source).pathItems) + assertPathItems(components32(source).pathItems) } "gets components pathItems is empty if missing" { - components().pathItems.shouldBeEmpty() + components31().pathItems.shouldBeEmpty() + components32().pathItems.shouldBeEmpty() } - }) diff --git a/openapi-parser/src/test/kotlin/io/openapiparser/model/v31/DiscriminatorSpec.kt b/openapi-parser/src/test/kotlin/io/openapiparser/model/v31/DiscriminatorSpec.kt index 12738bae..bb286ce8 100644 --- a/openapi-parser/src/test/kotlin/io/openapiparser/model/v31/DiscriminatorSpec.kt +++ b/openapi-parser/src/test/kotlin/io/openapiparser/model/v31/DiscriminatorSpec.kt @@ -7,12 +7,14 @@ package io.openapiparser.model.v31 import io.kotest.core.spec.style.StringSpec import io.openapiparser.model.v3x.testExtensions +import io.openapiparser.model.v31.discriminator as discriminator31 +import io.openapiparser.model.v32.discriminator as discriminator32 /** * @see [io.openapiparser.model.v3x.DiscriminatorSpec] */ class DiscriminatorSpec: StringSpec ({ - include(testExtensions("discriminator", ::discriminator) { it.extensions }) - + include(testExtensions("discriminator", ::discriminator31) { it.extensions }) + include(testExtensions("discriminator", ::discriminator32) { it.extensions }) }) diff --git a/openapi-parser/src/test/kotlin/io/openapiparser/model/v31/InfoSpec.kt b/openapi-parser/src/test/kotlin/io/openapiparser/model/v31/InfoSpec.kt index e406dae2..6ec56c67 100644 --- a/openapi-parser/src/test/kotlin/io/openapiparser/model/v31/InfoSpec.kt +++ b/openapi-parser/src/test/kotlin/io/openapiparser/model/v31/InfoSpec.kt @@ -8,6 +8,8 @@ package io.openapiparser.model.v31 import io.kotest.core.spec.style.StringSpec import io.kotest.matchers.nulls.shouldBeNull import io.kotest.matchers.shouldBe +import io.openapiparser.model.v31.info as info31 +import io.openapiparser.model.v32.info as info32 /** * @see [io.openapiparser.model.v3x.InfoSpec] @@ -15,10 +17,12 @@ import io.kotest.matchers.shouldBe class InfoSpec : StringSpec({ "gets info summary" { - info("summary: the summary").summary shouldBe "the summary" + info31("summary: the summary").summary shouldBe "the summary" + info32("summary: the summary").summary shouldBe "the summary" } "gets info summary is null if missing" { - info().summary.shouldBeNull() + info31().summary.shouldBeNull() + info32().summary.shouldBeNull() } }) diff --git a/openapi-parser/src/test/kotlin/io/openapiparser/model/v31/LicenseSpec.kt b/openapi-parser/src/test/kotlin/io/openapiparser/model/v31/LicenseSpec.kt index 4f36bed0..d41a289b 100644 --- a/openapi-parser/src/test/kotlin/io/openapiparser/model/v31/LicenseSpec.kt +++ b/openapi-parser/src/test/kotlin/io/openapiparser/model/v31/LicenseSpec.kt @@ -8,6 +8,8 @@ package io.openapiparser.model.v31 import io.kotest.core.spec.style.StringSpec import io.kotest.matchers.nulls.shouldBeNull import io.kotest.matchers.shouldBe +import io.openapiparser.model.v31.license as license31 +import io.openapiparser.model.v31.license as license32 /** * @see [io.openapiparser.model.v3x.LicenseSpec] @@ -15,10 +17,12 @@ import io.kotest.matchers.shouldBe class LicenseSpec : StringSpec({ "gets license identifier" { - license("identifier: Apache-2.0").identifier shouldBe "Apache-2.0" + license31("identifier: Apache-2.0").identifier shouldBe "Apache-2.0" + license32("identifier: Apache-2.0").identifier shouldBe "Apache-2.0" } "gets license identifier is null if missing" { - license().identifier.shouldBeNull() + license31().identifier.shouldBeNull() + license32().identifier.shouldBeNull() } }) diff --git a/openapi-parser/src/test/kotlin/io/openapiparser/model/v31/OpenApi.kt b/openapi-parser/src/test/kotlin/io/openapiparser/model/v31/OpenApi.kt new file mode 100644 index 00000000..82f83d43 --- /dev/null +++ b/openapi-parser/src/test/kotlin/io/openapiparser/model/v31/OpenApi.kt @@ -0,0 +1,15 @@ +/* + * Copyright 2025 https://github.com/openapi-processor/openapi-parser + * PDX-License-Identifier: Apache-2.0 + */ + +package io.openapiparser.model.v31 + +import io.openapiparser.Keywords.OPENAPI +import io.openapiparser.OpenApiSchemas.OPENAPI_VERSION_31_LATEST + +@Suppress("UNCHECKED_CAST") +fun OpenApi.setVersion() { + val properties = getRawValueOf("") as MutableMap + properties[OPENAPI] = OPENAPI_VERSION_31_LATEST +} diff --git a/openapi-parser/src/test/kotlin/io/openapiparser/model/v31/OpenApiSpec.kt b/openapi-parser/src/test/kotlin/io/openapiparser/model/v31/OpenApiSpec.kt index 5b6432e4..63ee30fc 100644 --- a/openapi-parser/src/test/kotlin/io/openapiparser/model/v31/OpenApiSpec.kt +++ b/openapi-parser/src/test/kotlin/io/openapiparser/model/v31/OpenApiSpec.kt @@ -10,6 +10,8 @@ import io.kotest.matchers.maps.shouldBeEmpty import io.kotest.matchers.nulls.shouldBeNull import io.kotest.matchers.nulls.shouldNotBeNull import io.kotest.matchers.shouldBe +import io.openapiparser.model.v31.openapi as openapi31 +import io.openapiparser.model.v32.openapi as openapi32 /** * @see [io.openapiparser.model.v3x.OpenApiSpec] @@ -17,34 +19,44 @@ import io.kotest.matchers.shouldBe class OpenApiSpec: StringSpec({ "gets json schema dialect" { - openapi("jsonSchemaDialect: https://schema.uri").jsonSchemaDialect.shouldNotBeNull() + openapi31("jsonSchemaDialect: https://schema.uri").jsonSchemaDialect.shouldNotBeNull() + openapi32("jsonSchemaDialect: https://schema.uri").jsonSchemaDialect.shouldNotBeNull() } "gets null json schema dialect if it missing" { - openapi().jsonSchemaDialect.shouldBeNull() + openapi31().jsonSchemaDialect.shouldBeNull() + openapi32().jsonSchemaDialect.shouldBeNull() } "gets paths object" { - openapi("paths: {}").paths.shouldNotBeNull() + openapi31("paths: {}").paths.shouldNotBeNull() + openapi32("paths: {}").paths.shouldNotBeNull() } "gets path object is null if it missing" { - openapi().paths.shouldBeNull() + openapi31().paths.shouldBeNull() + openapi32().paths.shouldBeNull() } - "gets webhooks objects" { - val webhooks = openapi(""" - webhooks: - /foo: {} - /bar: {} - """).webhooks - + fun assertWebhooks (webhooks: Map) { webhooks.size shouldBe 2 webhooks["/foo"].shouldNotBeNull() webhooks["/bar"].shouldNotBeNull() } + "gets webhooks objects" { + val source = """ + webhooks: + /foo: {} + /bar: {} + """ + + assertWebhooks(openapi31(source).webhooks) + assertWebhooks(openapi32(source).webhooks) + } + "gets webhooks is empty if it is missing" { - openapi().webhooks.shouldBeEmpty() + openapi31().webhooks.shouldBeEmpty() + openapi32().webhooks.shouldBeEmpty() } }) diff --git a/openapi-parser/src/test/kotlin/io/openapiparser/model/v31/OperationSpec.kt b/openapi-parser/src/test/kotlin/io/openapiparser/model/v31/OperationSpec.kt index 878922a6..1802f66d 100644 --- a/openapi-parser/src/test/kotlin/io/openapiparser/model/v31/OperationSpec.kt +++ b/openapi-parser/src/test/kotlin/io/openapiparser/model/v31/OperationSpec.kt @@ -8,6 +8,8 @@ package io.openapiparser.model.v31 import io.kotest.core.spec.style.StringSpec import io.kotest.matchers.nulls.shouldBeNull import io.kotest.matchers.nulls.shouldNotBeNull +import io.openapiparser.model.v31.operation as operation31 +import io.openapiparser.model.v31.operation as operation32 /** * @see [io.openapiparser.model.v3x.OperationSpec] @@ -15,11 +17,12 @@ import io.kotest.matchers.nulls.shouldNotBeNull class OperationSpec: StringSpec({ "gets operation responses" { - operation("responses: {}").responses.shouldNotBeNull() + operation31("responses: {}").responses.shouldNotBeNull() + operation32("responses: {}").responses.shouldNotBeNull() } "gets operation responses is null if missing" { - operation().responses.shouldBeNull() + operation31().responses.shouldBeNull() + operation32().responses.shouldBeNull() } - }) diff --git a/openapi-parser/src/test/kotlin/io/openapiparser/model/v31/PathItemSpec.kt b/openapi-parser/src/test/kotlin/io/openapiparser/model/v31/PathItemSpec.kt index b4f7f892..6ea0cd53 100644 --- a/openapi-parser/src/test/kotlin/io/openapiparser/model/v31/PathItemSpec.kt +++ b/openapi-parser/src/test/kotlin/io/openapiparser/model/v31/PathItemSpec.kt @@ -9,6 +9,8 @@ import io.kotest.core.spec.style.StringSpec import io.kotest.matchers.collections.shouldContainExactly import io.kotest.matchers.maps.shouldHaveSize import io.openapiparser.support.ApiBuilder +import io.openapiparser.model.v31.openapi as openapi31 +import io.openapiparser.model.v31.pathItem as pathItem31 class PathItemSpec : StringSpec({ @@ -26,9 +28,9 @@ class PathItemSpec : StringSpec({ patch: {} trace: {} """.trimIndent()) - .buildOpenApi30() + .buildOpenApi31() - val path = api.paths.getPathItem("/foo") + val path = api.paths!!.getPathItem("/foo") val operations = path?.operations operations?.shouldHaveSize(8) diff --git a/openapi-parser/src/test/kotlin/io/openapiparser/model/v31/SchemaSpec.kt b/openapi-parser/src/test/kotlin/io/openapiparser/model/v31/SchemaSpec.kt index df74a4e3..83624f62 100644 --- a/openapi-parser/src/test/kotlin/io/openapiparser/model/v31/SchemaSpec.kt +++ b/openapi-parser/src/test/kotlin/io/openapiparser/model/v31/SchemaSpec.kt @@ -13,6 +13,8 @@ import io.kotest.matchers.maps.shouldContainKey import io.kotest.matchers.nulls.shouldBeNull import io.kotest.matchers.nulls.shouldNotBeNull import io.kotest.matchers.shouldBe +import io.openapiparser.model.v31.schema as schema31 +import io.openapiparser.model.v31.schema as schema32 /** * @see [io.openapiparser.model.v3x.SchemaSpec] @@ -38,8 +40,8 @@ class SchemaSpec: StringSpec({ // xml "gets schema type" { - schema("type: string").type shouldBe listOf("string") - schema("type: [string, object]").type shouldBe listOf("string", "object") + schema31("type: string").type shouldBe listOf("string") + schema31("type: [string, object]").type shouldBe listOf("string", "object") } // "gets schema type throws if missing" { @@ -47,45 +49,45 @@ class SchemaSpec: StringSpec({ // } "gets schema const" { - schema("const: foo").const shouldBe "foo" + schema31("const: foo").const shouldBe "foo" } "gets schema const is null if missing" { - schema().const.shouldBeNull() + schema31().const.shouldBeNull() } "gets schema maxContains" { - schema("maxContains: 9").maxContains shouldBe 9 + schema31("maxContains: 9").maxContains shouldBe 9 } "gets schema maxContains is null if missing" { - schema().maxContains.shouldBeNull() + schema31().maxContains.shouldBeNull() } "gets schema minContains" { - schema("minContains: 9").minContains shouldBe 9 + schema31("minContains: 9").minContains shouldBe 9 } "gets schema minContains is 1 if missing" { - schema().minContains shouldBe 1 + schema31().minContains shouldBe 1 } "gets schema exclusiveMaximum is null if missing" { - schema().exclusiveMaximum.shouldBeNull() + schema31().exclusiveMaximum.shouldBeNull() } "gets schema exclusiveMinimum is null if missing" { - schema().exclusiveMinimum.shouldBeNull() + schema31().exclusiveMinimum.shouldBeNull() } "gets schema dependentRequired" { - val required = schema("dependentRequired: {bar: [foo]}").dependentRequired + val required = schema31("dependentRequired: {bar: [foo]}").dependentRequired required shouldContainKey "bar" required["bar"].shouldContainExactly("foo") } "gets schema dependentRequired is empty if missing" { - schema().dependentRequired.shouldNotBeNull() + schema31().dependentRequired.shouldNotBeNull() } "gets schema patternProperties" { @@ -95,45 +97,45 @@ class SchemaSpec: StringSpec({ bar: {} """ - val properties = schema(source).patternProperties + val properties = schema31(source).patternProperties properties.size shouldBe 2 properties["foo"].shouldNotBeNull() properties["bar"].shouldNotBeNull() } "gets schema patternProperties is empty if missing" { - schema().patternProperties.shouldBeEmpty() + schema31().patternProperties.shouldBeEmpty() } "gets schema additionalProperties" { - schema("additionalProperties: {}").additionalProperties.shouldNotBeNull() + schema31("additionalProperties: {}").additionalProperties.shouldNotBeNull() } "gets schema additionalProperties is null if missing" { - schema().additionalProperties.shouldBeNull() + schema31().additionalProperties.shouldBeNull() } "gets schema propertyNames" { - schema("propertyNames: {}").propertyNames.shouldNotBeNull() + schema31("propertyNames: {}").propertyNames.shouldNotBeNull() } "gets schema propertyNames is null if missing" { - schema().propertyNames.shouldBeNull() + schema31().propertyNames.shouldBeNull() } "gets schema prefixItems" { - schema("prefixItems: [{}]").prefixItems.size shouldBe 1 + schema31("prefixItems: [{}]").prefixItems.size shouldBe 1 } "gets schema prefixItems is empty if missing" { - schema().prefixItems.shouldBeEmpty() + schema31().prefixItems.shouldBeEmpty() } "gets schema contains" { - schema("contains: {}").contains.shouldNotBeNull() + schema31("contains: {}").contains.shouldNotBeNull() } "gets schema contains is null if missing" { - schema().contains.shouldBeNull() + schema31().contains.shouldBeNull() } })