Skip to content

Alternative Schema Update based on TSC Comments #1913

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 25 commits into from
Closed
Show file tree
Hide file tree
Changes from 9 commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
5fb3f05
Merge pull request #1 from OAI/master
cmheazel Mar 15, 2019
dd48f9e
Alternative Schema Proposal
cmheazel Mar 15, 2019
24e15cb
Swift patterned update
cmheazel Apr 17, 2019
e727f10
Alternative Schema Cleanup
cmheazel Apr 17, 2019
059c4a1
April 18 update
cmheazel Apr 18, 2019
4a51b6f
Cleanup from last TSC review
cmheazel May 1, 2019
0db22da
Fixed URL for Registry
cmheazel May 1, 2019
a912886
Status update roll-back
cmheazel May 8, 2019
c4c7c82
Roll-back the roll-back
cmheazel May 8, 2019
bc14281
Update to work around conflicts
cmheazel Jun 3, 2019
7537694
Conflict resolution update
cmheazel Jun 3, 2019
a229147
Conflict resolution
cmheazel Jun 3, 2019
d1338b9
Conflict resolution
cmheazel Jun 3, 2019
8e94845
Conflict resolution
cmheazel Jun 3, 2019
1980cc0
restore to previous
cmheazel Jun 3, 2019
f99a797
Deleted conflicting files
cmheazel Jun 3, 2019
1da56ee
Merge pull request #2 from OAI/master
cmheazel Jun 3, 2019
a7bb859
Restored deleted files
cmheazel Jun 3, 2019
b0820c3
Merge branch 'master' of https://github.com/cmheazel/OpenAPI-Specific…
cmheazel Jul 22, 2019
2dd8903
Merge pull request #3 from OAI/master
cmheazel Jul 22, 2019
c8affb9
Attempt to fix alternative schema
cmheazel Jul 22, 2019
4ddc53f
Changed registry URL
cmheazel Aug 21, 2019
f56841f
Alternative Schema Registry URL
cmheazel Aug 21, 2019
a1df975
Merge branch 'master' of https://github.com/cmheazel/OpenAPI-Specific…
cmheazel Aug 21, 2019
0d457a0
Delete 001_Alternative-Schema-Proposal.md
cmheazel Aug 21, 2019
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
44 changes: 44 additions & 0 deletions proposals/000_OAS-proposal-template.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
# Feature name


## Metadata

|Tag |Value |
|---- | ---------------- |
|Proposal |[NNNN](https://github.com/OAI/OpenAPI-Specification/tree/master/proposals/{directory_or_file_name})|
|Authors|[Author 1](https://github.com/{author1}), [Author 2](https://github.com/{author2})|
|Review Manager |TBD |
|Status |Draft, Pilot, Graduated, or Abandoned|
|Implementations |[Click Here](https://github.com/OAI/OpenAPI-Specification/tree/master/proposals/{NNNN}/implementations.md)|
|Issues |[{issueid}](https://github.com/OAI/OpenAPI-Specification/issues/{Issueid})|
|Previous Revisions |[{revid}](https://github.com/OAI/OpenAPI-Specification/pull/{revid}) |

.Change Log

|Date |Responsible Party |Description |
|---- | ---------------- | ---------- |

## Introduction

A short description of what the feature is. Try to keep it to a single-paragraph "elevator pitch" so the reader understands what problem this proposal is addressing.

## Motivation

Describe the problems that this proposal seeks to address. If the problem is that some common pattern is currently hard to express, show how one can currently get a similar effect and describe its drawbacks. If it's completely new functionality that cannot be emulated, motivate why this new functionality would help OpenAPI developers create better code.

## Proposed solution

Describe your solution to the problem. Provide examples and describe how they work. Show how your solution is better than current workarounds: is it cleaner, safer, or more efficient?

## Detailed design

Describe the design of the solution in detail. This should include an exact description of the changes to the contents of the OpenAPI specification. That description should include a extract of each section of the OpenAPI specification which is impacted by the proposal with all proposed modifications applied. These extracts may be provided through additional files which are identified and described in this section.

## Backwards compatibility

Proposals should be structure so that they can be handled by existing OAS compliant software. Any potential issues should be identified and discussed.

## Alternatives considered

Describe alternative approaches to addressing the same problem, and why you chose this approach instead.

74 changes: 74 additions & 0 deletions proposals/001_Alternative Schema Proposal.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
# Alternative Schema

## Metadata

|Tag |Value |
|---- | ---------------- |
|Proposal |[Alternative Schema](https://github.com/OAI/OpenAPI-Specification/tree/master/proposals/Alternative%20Schema)|
|Authors|[Chuck Heazel](https://github.com/cmheazel)|
|Review Manager |TBD |
|Status |**Pilot** |
|Implementations |[Click Here](https://github.com/OAI/OpenAPI-Specification/tree/master/proposals/Alternative%20Schema/implementations.md)
|Issues |[1532](https://github.com/OAI/OpenAPI-Specification/issues/1532)|
|Previous Revisions |[March 15](https://github.com/OAI/OpenAPI-Specification/pull/1868#issue-261689900) |

.Change Log

|Date |Responsible Party |Description |
|---- | ---------------- | ---------- |
|3/15/19 |C. Heazel|Initial Markup Draft |
|4/17/19 |C. Heazel|Re-structured based on Apple Swift|
|5/1/19 |C. Heazel|Cleaned up typos and broken links. Updated the proposal stage names.|

## Introduction

This a proposal to add a new field called ``alternativeSchema`` to the OAS.

## Motivation

OpenAPI allows APIs to describe the syntax of their request and response messaged using a JSON Schema-like syntax. However, not all messages will be in JSON. The ability to refer to one or more external schema will allow an API to describe the syntax of a message regardless of the format used.

For example: Some XML payloads are defined by an XML schema (the syntax) and a suite of Schematron rules (valid values). JSON Schema cannot effectively represent their content. By providing access to the appropriate appropriate XML Schema and Schematron files, the payload can be validated the way it was intended to be.

## Proposed solution

This proposal makes the following changes to the OAS 3.0 specification:

1. Extend the Schema Object by the addition of the x-oas-draft-alternativeSchema field.
1. Addition of the Alternative Schema Object.
1. Addition of Alternative Schema examples.
1. Addition of a preliminary discussion of the Alternative Schema registry.

## Detailed design

### Extend the Schema Object

The OpenAPI Schema Object is extended by the addition of the x-oas-draft-alternativeSchema field. The proposed changes to the OpenAPI specification are provided in [schema_object.md](https://github.com/OAI/OpenAPI-Specification/tree/master/proposals/Alternative%20Schema/schema_object.md)

### Add the Alternative Schema Object

The new object, the Alternative Schema Object is added to the OpenAPI specification. The proposed changes to the OpenAPI specification are provided in [alternative_schema_object.md](https://github.com/OAI/OpenAPI-Specification/tree/master/proposals/Alternative%20Schema/alternative_schema_object.md)

### Provide Alternative Schema Examples
Examples of the use of the Alternative Schema capability is added to the OpenAPI specification. The proposed changes to the OpenAPI specification are provided in [alternative_schema_examples.md](https://github.com/OAI/OpenAPI-Specification/tree/master/proposals/Alternative%20Schema/alternative_schema_examples.md)

### Alternative Schema Registry

Values used to populate the Alternative Schema Object are required to come from the Alternative Schema Registry. The preliminary Alternative Schema Registry is located [here](https://spec.openapis.org/registry/alternative-schema).

*** Note this is a placeholder registry. Don't take the values seriously. ***

Inital contents of the registry will include:

|Name |Link |Description |
|--- | --- | --- |
|jsonSchema |TBD |JSON Schema | |xsdSchema |TBD |XML Schema |

## Backwards compatibility

This proposal makes use of the extensibility features of OpenAPI. All changes sould appear as extensions and handled accordingly.

## Alternatives considered

Embedding non-JSON content in the OAS document would have imposed an unacceptable burden on tooling. Therefore, an extenal link was prefered. Considerable discussion was held over exactly how the links should be represented in the Schema Object. The selected option should support the greatest number of possible combinations of external schema that can be expressed with the OpenAPI schema language.

2 changes: 2 additions & 0 deletions proposals/Alternative Schema/CONTRIBUTORS.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
* Chuck Heazel [@cmheazel](https://github.com/cmheazel)
* Darrel Miller [@darrelmiller](https://github.com/darrelmiller)
38 changes: 38 additions & 0 deletions proposals/Alternative Schema/DEVELOPMENT.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
## Development Guidelines

TBD

## Specification Driving factors

TBD

## Specification Change Criteria

TBD

## Specification Change Process

TBD

## Tracking Process

* GitHub is the medium of record for all spec designs, use cases, and so on.


## Release Process

TBD

## Draft Features


## Transparency



## Participation



## Community Roles

53 changes: 53 additions & 0 deletions proposals/Alternative Schema/alternative_schema_examples.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
## Change: Add Alternative Schema Examples

The following text is to be inserted after the Alternative Schema Object section.

### Alternative Schema Examples

Minimalist usage of alternative schema:

schema:
x-oas-draft-alternativeSchema:
type: jsonSchema
location: ./real-jsonschema.json

Combination of OAS schema and alternative:

schema:
type: object
nullable: true
x-oas-draft-alternativeSchema:
type: jsonSchema
location: ./real-jsonschema.json

Multiple different versions of alternative schema:

schema:
anyOf:
- x-oas-draft-alternativeSchema:
type: jsonSchema
location: ./real-jsonschema-08.json
- x-oas-draft-alternativeSchema:
type: jsonSchema
location: ./real-jsonschema-07.json

Combined alternative schemas:

schema:
allOf:
- x-oas-draft-alternativeSchema:
type: xmlSchema
location: ./xmlSchema.xsd
Copy link
Contributor

Choose a reason for hiding this comment

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

@cmheazel @andreapoli

How to support entities in an xsd? Would this work?

           type: xmlSchema
           location: schema.xsd#/person

Copy link
Contributor

Choose a reason for hiding this comment

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

Whole files only I believe, as it would be tough to support XML Path, JSONPath and Protobufpath wait there is no protobuf path. Better not use paths. :)

Copy link
Contributor

@ioggstream ioggstream May 31, 2019

Choose a reason for hiding this comment

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

imho location value could support path only for some type. The type could dictate the location patterns.

Not having paths could be problematic.

- x-oas-draft-alternativeSchema:
type: schematron
location: ./schema.sch

Mixed OAS schema and alternative schema:

schema:
type: array
items:
x-oas-draft-alternativeSchema:
type: jsonSchema
location: ./real-jsonschema.json

16 changes: 16 additions & 0 deletions proposals/Alternative Schema/alternative_schema_object.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
## Change: Add the Alternative Schema Object

The following text is to be inserted after the XML Object section

### Alternative Schema Object

This object makes it possible to reference an external file that contains a schema that does not follow the OAS specification. If tooling does not support the _type_, tooling MUST consider the content valid but SHOULD provide a warning that the alternative schema was not processed.

==== Fixed Fields

|Field Name | Type | Description |
|---|:---:|---|
|type | string | **REQUIRED**. The value MUST match one of the values identified in the alternative Schema Registry. |
|location | url | **REQUIRED**. This is a absolute or relative reference to an external resource containing a schema of a known type. This reference may contain a fragment identifier to reference only a subset of an external document. |

This object MAY be extended with Specification Extensions.
46 changes: 46 additions & 0 deletions proposals/Alternative Schema/implementations.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
# Implementations

## Overview

Below is a list of tooling that claims to implement the Alternative Schema proposal. While support for this feature matures, refer to the details of projects listed below for any notes about stability and roadmap. The process to improve the OpenAPI specification includes feedback from end-users and tooling creators. We strongly encourage draft tooling be made available for early users of OAS drafts.

These tools are not endorsed by the OAI

## Implementations:

#### Low-Level tooling

| Title | Project Link | Language | Description
| ----------- | ----------- | ----------- | -----------
|TBD |TBD |TBD |TBD |

#### Editors

| Title | Project Link | Language |Description |
|----------------|--------------|----------|---------------------|
|TBD |TBD |TBD |TBD |

#### User Interfaces

| Title | Project Link | Language |Description |
|----------------|--------------|----------|---------------------|
|TBD |TBD |TBD |TBD |

#### Mock Servers
| Title | Project Link | Language | Description |
| -------------- | ------------ | -------- | ----------- |
|TBD |TBD |TBD |TBD |

#### Server Implementations
| Title | Project Link | Language |Description |
|----------------|--------------|----------|---------------------|
|TBD |TBD |TBD |TBD |

#### Code Generators

| Title | Project Link | Language |Description |
|----------------|--------------|----------|---------------------|
|TBD |TBD |TBD |TBD |



17 changes: 17 additions & 0 deletions proposals/Alternative Schema/schema_object.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
## Change: Extend the Schema Object to support Alternative Schemas

The following content shall be used to replace the Fixed Fields table in the Schema Object section

#### Fixed Fields

|Field Name | Type | Description |
|---|:---:|---|
| nullable | `boolean` | Allows sending a `null` value for the defined schema. Default value is `false`.|
| discriminator | [Discriminator Object](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#discriminatorObject) | Adds support for polymorphism. The discriminator is an object name that is used to differentiate between other schemas which may satisfy the payload description. See [Composition and Inheritance](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#schemaComposition) for more details. |
| readOnly | `boolean` | Relevant only for Schema `"properties"` definitions. Declares the property as "read only". This means that it MAY be sent as part of a response but SHOULD NOT be sent as part of the request. If the property is marked as `readOnly` being `true` and is in the `required` list, the `required` will take effect on the response only. A property MUST NOT be marked as both `readOnly` and `writeOnly` being `true`. Default value is `false`. |
| writeOnly | `boolean` | Relevant only for Schema `"properties"` definitions. Declares the property as "write only". Therefore, it MAY be sent as part of a request but SHOULD NOT be sent as part of the response. If the property is marked as `writeOnly` being `true` and is in the `required` list, the `required` will take effect on the request only. A property MUST NOT be marked as both `readOnly` and `writeOnly` being `true`. Default value is `false`. |
| xml | [XML Object](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#xmlObject) | This MAY be used only on properties schemas. It has no effect on root schemas. Adds additional metadata to describe the XML representation of this property. |
| externalDocs | [External Documentation Object](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#externalDocumentationObject) | Additional external documentation for this schema.
| example | Any | A free-form property to include an example of an instance for this schema. To represent examples that cannot be naturally represented in JSON or YAML, a string value can be used to contain the example with escaping where necessary.|
| deprecated | `boolean` | Specifies that a schema is deprecated and SHOULD be transitioned out of usage. Default value is `false`.|
|x-oas-draft-alternativeSchema |alternative Schema Object |An external schema that participates in the validation of content along with other schema keywords. |