Replace all mentions of Swagger by OpenAPI (#1633)
Signed-off-by: Kévin Commaille <zecakeh@tedomum.fr>
This commit is contained in:
parent
df3f0af5d4
commit
99e2ff4927
17 changed files with 40 additions and 87 deletions
6
.github/workflows/main.yml
vendored
6
.github/workflows/main.yml
vendored
|
@ -92,17 +92,17 @@ jobs:
|
||||||
export RELEASE="unstable"
|
export RELEASE="unstable"
|
||||||
fi
|
fi
|
||||||
# The output path matches the final deployment path at spec.matrix.org
|
# The output path matches the final deployment path at spec.matrix.org
|
||||||
scripts/dump-swagger.py \
|
scripts/dump-openapi.py \
|
||||||
--base-url "https://spec.matrix.org${{ needs.calculate-baseurl.outputs.baseURL }}" \
|
--base-url "https://spec.matrix.org${{ needs.calculate-baseurl.outputs.baseURL }}" \
|
||||||
--api application-service \
|
--api application-service \
|
||||||
-r "$RELEASE" \
|
-r "$RELEASE" \
|
||||||
-o spec/application-service-api/api.json
|
-o spec/application-service-api/api.json
|
||||||
scripts/dump-swagger.py \
|
scripts/dump-openapi.py \
|
||||||
--base-url "https://spec.matrix.org${{ needs.calculate-baseurl.outputs.baseURL }}" \
|
--base-url "https://spec.matrix.org${{ needs.calculate-baseurl.outputs.baseURL }}" \
|
||||||
--api client-server \
|
--api client-server \
|
||||||
-r "$RELEASE" \
|
-r "$RELEASE" \
|
||||||
-o spec/client-server-api/api.json
|
-o spec/client-server-api/api.json
|
||||||
scripts/dump-swagger.py \
|
scripts/dump-openapi.py \
|
||||||
--base-url "https://spec.matrix.org${{ needs.calculate-baseurl.outputs.baseURL }}" \
|
--base-url "https://spec.matrix.org${{ needs.calculate-baseurl.outputs.baseURL }}" \
|
||||||
--api push-gateway \
|
--api push-gateway \
|
||||||
-r "$RELEASE" \
|
-r "$RELEASE" \
|
||||||
|
|
2
.gitignore
vendored
2
.gitignore
vendored
|
@ -2,7 +2,7 @@ node_modules
|
||||||
/data/msc
|
/data/msc
|
||||||
/env*
|
/env*
|
||||||
/resources
|
/resources
|
||||||
/scripts/swagger
|
/scripts/openapi
|
||||||
/scripts/tmp
|
/scripts/tmp
|
||||||
/hugo-config.toml
|
/hugo-config.toml
|
||||||
/public
|
/public
|
||||||
|
|
14
README.md
14
README.md
|
@ -22,7 +22,7 @@ The Matrix spec is compiled with [Hugo](https://gohugo.io/) (a static site gener
|
||||||
|
|
||||||
* `/data`: this can contain TOML, YAML, or JSON files. Files kept here are directly available to template code as
|
* `/data`: this can contain TOML, YAML, or JSON files. Files kept here are directly available to template code as
|
||||||
[data objects](https://gohugo.io/templates/data-templates/), so templates don't need to load them from a file and
|
[data objects](https://gohugo.io/templates/data-templates/), so templates don't need to load them from a file and
|
||||||
parse them. This is also where our Swagger/OpenAPI definitions and schemas are.
|
parse them. This is also where our OpenAPI definitions and schemas are.
|
||||||
|
|
||||||
* `/layouts`: this contains [Hugo templates](https://gohugo.io/templates/). Some templates define the overall layout of
|
* `/layouts`: this contains [Hugo templates](https://gohugo.io/templates/). Some templates define the overall layout of
|
||||||
a page: for example, whether it has header, footer, sidebar, and so on.
|
a page: for example, whether it has header, footer, sidebar, and so on.
|
||||||
|
@ -52,7 +52,7 @@ Additionally, the following directories may be of interest:
|
||||||
* `/data-definitions`: Bits of structured data consumable by Matrix implementations.
|
* `/data-definitions`: Bits of structured data consumable by Matrix implementations.
|
||||||
* `/meta`: Documentation relating to the spec's processes that are otherwise untracked (release instructions, etc).
|
* `/meta`: Documentation relating to the spec's processes that are otherwise untracked (release instructions, etc).
|
||||||
* `/scripts`: Various scripts for generating the spec and validating its contents.
|
* `/scripts`: Various scripts for generating the spec and validating its contents.
|
||||||
* `/packages`: Various packages for shipping spec files like OpenAPI/swagger bindings and data definitions.
|
* `/packages`: Various packages for shipping spec files like OpenAPI bindings and data definitions.
|
||||||
|
|
||||||
## Authoring changes to the spec
|
## Authoring changes to the spec
|
||||||
|
|
||||||
|
@ -87,13 +87,13 @@ steps for authoring changes to the specification and instead of `hugo serve` run
|
||||||
spec to `/spec`. If you'd like to serve the spec off a path instead of a domain root (eg: `/unstable`), add `--baseURL "/unstable"`
|
spec to `/spec`. If you'd like to serve the spec off a path instead of a domain root (eg: `/unstable`), add `--baseURL "/unstable"`
|
||||||
to the `hugo -d "spec"` command.
|
to the `hugo -d "spec"` command.
|
||||||
|
|
||||||
For building the swagger definitions, create a python3 virtualenv and activate it. Then run `pip install -r ./scripts/requirements.txt`
|
For building the OpenAPI definitions, create a python3 virtualenv and activate it. Then run `pip install -r ./scripts/requirements.txt`
|
||||||
and finally `python ./scripts/dump-swagger.py` to generate it to `./scripts/swagger/api-docs.json`. To make use of the generated file,
|
and finally `python ./scripts/dump-openapi.py` to generate it to `./scripts/openapi/api-docs.json`. To make use of the generated file,
|
||||||
there are a number of options:
|
there are a number of options:
|
||||||
|
|
||||||
* You can open `./scripts/swagger-preview.html` in your browser, and then open the file by clicking on `Local JSON File`.
|
* You can open `./scripts/openapi-preview.html` in your browser, and then open the file by clicking on `Local JSON File`.
|
||||||
* You can run a local HTTP server by running `./scripts/swagger-http-server.py`, and then view the documentation by
|
* You can run a local HTTP server by running `./scripts/openapi-http-server.py`, and then view the documentation by
|
||||||
opening `./scripts/swagger-preview.html` in your browser.
|
opening `./scripts/openapi-preview.html` in your browser.
|
||||||
|
|
||||||
## Issue tracking
|
## Issue tracking
|
||||||
|
|
||||||
|
|
1
changelogs/internal/newsfragments/1633.clarification
Normal file
1
changelogs/internal/newsfragments/1633.clarification
Normal file
|
@ -0,0 +1 @@
|
||||||
|
Replace all mentions of Swagger by OpenAPI.
|
|
@ -40,7 +40,7 @@ paths:
|
||||||
one_time_keys:
|
one_time_keys:
|
||||||
# $ref: "definitions/one_time_keys.yaml"
|
# $ref: "definitions/one_time_keys.yaml"
|
||||||
# XXX: We can't define an actual object here, so we have to hope
|
# XXX: We can't define an actual object here, so we have to hope
|
||||||
# that people will look at the swagger source or can figure it out
|
# that people will look at the OpenAPI source or can figure it out
|
||||||
# from the other endpoints/example.
|
# from the other endpoints/example.
|
||||||
type: object
|
type: object
|
||||||
title: OneTimeKeys
|
title: OneTimeKeys
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
{{/*
|
{{/*
|
||||||
|
|
||||||
Resolves the `allOf` keyword (https://swagger.io/specification/v2/#composition-and-inheritance-polymorphism),
|
Resolves the `allOf` keyword (https://spec.openapis.org/oas/v3.1.0#composition-and-inheritance-polymorphism),
|
||||||
given a JSON schema object.
|
given a JSON schema object.
|
||||||
|
|
||||||
`allOf` is used to support a kind of inheritance for JSON schema objects.
|
`allOf` is used to support a kind of inheritance for JSON schema objects.
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
Render an HTTP API, given:
|
Render an HTTP API, given:
|
||||||
|
|
||||||
* `api_data`: the OpenAPI/Swagger data
|
* `api_data`: the OpenAPI data
|
||||||
* `base_url`: the base URL: that is, the part we glue onto the front
|
* `base_url`: the base URL: that is, the part we glue onto the front
|
||||||
of each value in `paths` to get a complete URL.
|
of each value in `paths` to get a complete URL.
|
||||||
* `path`: the directory under /data where we found this API definition.
|
* `path`: the directory under /data where we found this API definition.
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
|
|
||||||
* `method`: the method, e.g. GET, PUT
|
* `method`: the method, e.g. GET, PUT
|
||||||
* `endpoint`: the endpoint
|
* `endpoint`: the endpoint
|
||||||
* `operation_data`: the OpenAPI/Swagger data for the operation
|
* `operation_data`: the OpenAPI data for the operation
|
||||||
* `path`: the path where this definition was found, to enable us to resolve "$ref"
|
* `path`: the path where this definition was found, to enable us to resolve "$ref"
|
||||||
|
|
||||||
This template renders the operation as a `<section>` containing:
|
This template renders the operation as a `<section>` containing:
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
Render the parameters of a given type, given:
|
Render the parameters of a given type, given:
|
||||||
|
|
||||||
* `parameters`: OpenAPI/Swagger data specifying the parameters
|
* `parameters`: OpenAPI data specifying the parameters
|
||||||
* `type`: the type of parameters to render: "header, ""path", "query"
|
* `type`: the type of parameters to render: "header, ""path", "query"
|
||||||
* `caption`: caption to use for the table
|
* `caption`: caption to use for the table
|
||||||
|
|
||||||
|
|
|
@ -2,8 +2,8 @@
|
||||||
|
|
||||||
Render the request part of a single HTTP API operation, given:
|
Render the request part of a single HTTP API operation, given:
|
||||||
|
|
||||||
* `parameters`: OpenAPI/Swagger data specifying the parameters
|
* `parameters`: OpenAPI data specifying the parameters
|
||||||
* `request_body`: OpenAPI/Swagger data specifying the request body
|
* `request_body`: OpenAPI data specifying the request body
|
||||||
* `path`: the path where this definition was found, to enable us to resolve "$ref"
|
* `path`: the path where this definition was found, to enable us to resolve "$ref"
|
||||||
* `anchor_base`: a prefix to add to the HTML anchors generated for each object
|
* `anchor_base`: a prefix to add to the HTML anchors generated for each object
|
||||||
|
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
Render the response part of a single HTTP API operation, given:
|
Render the response part of a single HTTP API operation, given:
|
||||||
|
|
||||||
* `responses`: OpenAPI/Swagger data specifying the responses
|
* `responses`: OpenAPI data specifying the responses
|
||||||
* `path`: the path where this definition was found, to enable us to resolve "$ref"
|
* `path`: the path where this definition was found, to enable us to resolve "$ref"
|
||||||
* `anchor_base`: a prefix to add to the HTML anchors generated for each object
|
* `anchor_base`: a prefix to add to the HTML anchors generated for each object
|
||||||
|
|
||||||
|
|
|
@ -1,12 +1,12 @@
|
||||||
{{/*
|
{{/*
|
||||||
|
|
||||||
This template is used to render an HTTP API, given an OpenAPI/Swagger definition.
|
This template is used to render an HTTP API, given an OpenAPI definition.
|
||||||
|
|
||||||
It expects to be passed two parameters:
|
It expects to be passed two parameters:
|
||||||
|
|
||||||
* a `spec` parameter identifying the spec, which must be the name of
|
* a `spec` parameter identifying the spec, which must be the name of
|
||||||
a directory under /data/api
|
a directory under /data/api
|
||||||
* an `api` parameter, identifying an OpenAPI/Swagger definition,
|
* an `api` parameter, identifying an OpenAPI definition,
|
||||||
which is the name of a schema file under "data/api/$spec".
|
which is the name of a schema file under "data/api/$spec".
|
||||||
The file extension is omitted. For example:
|
The file extension is omitted. For example:
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
# OpenAPI Extensions
|
# OpenAPI Extensions
|
||||||
|
|
||||||
For some functionality that is not directly provided by the OpenAPI v2
|
For some functionality that is not directly provided by the OpenAPI v3.1
|
||||||
specification, some extensions have been added that are to be consistent
|
specification, some extensions have been added that are to be consistent
|
||||||
across the specification. The defined extensions are listed below. Extensions
|
across the specification. The defined extensions are listed below. Extensions
|
||||||
should not break parsers, however if extra functionality is required, aware
|
should not break parsers, however if extra functionality is required, aware
|
||||||
|
@ -12,56 +12,9 @@ To ease API design and management, the API definition is split across several
|
||||||
files. Each of these files is self-contained valid OpenAPI.
|
files. Each of these files is self-contained valid OpenAPI.
|
||||||
|
|
||||||
There is no single root file in the source tree as OpenAPI requires; this file
|
There is no single root file in the source tree as OpenAPI requires; this file
|
||||||
can be generated by `dump-swagger.py`. The script does not convert
|
can be generated by `dump-openapi.py`. The script does not convert
|
||||||
the extensions described further in this document (`oneOf` and parameter
|
the extensions described further in this document so there can be minor
|
||||||
exploding) so there can be minor interoperability issues with tooling that
|
interoperability issues with tooling that expects compliant OpenAPI.
|
||||||
expects compliant Swagger.
|
|
||||||
|
|
||||||
## Extensible Query Parameters
|
|
||||||
|
|
||||||
<!-- TODO: Remove and change instances to 'explode' after OpenAPI/Swagger v3 update -->
|
|
||||||
|
|
||||||
If a unknown amount of query parameters can be added to a request, the `name`
|
|
||||||
must be `fields...`, with the trailing ellipses representing the possibility
|
|
||||||
of more fields.
|
|
||||||
|
|
||||||
Example:
|
|
||||||
|
|
||||||
```
|
|
||||||
- in: query
|
|
||||||
name: fields...
|
|
||||||
type: string
|
|
||||||
```
|
|
||||||
|
|
||||||
## Using oneOf to provide type alternatives
|
|
||||||
|
|
||||||
<!-- TODO: Remove this section after upgrading to OpenAPI v3 -->
|
|
||||||
|
|
||||||
`oneOf` (available in JSON Schema and Swagger/OpenAPI v3 but not in v2)
|
|
||||||
is used in cases when a simpler type specification as a list of types
|
|
||||||
doesn't work, as in the following example:
|
|
||||||
```
|
|
||||||
properties:
|
|
||||||
old: # compliant with old Swagger
|
|
||||||
type:
|
|
||||||
- string
|
|
||||||
- object # Cannot specify a schema here
|
|
||||||
new: # uses oneOf extension
|
|
||||||
oneOf:
|
|
||||||
- type: string
|
|
||||||
- type: object
|
|
||||||
title: CustomSchemaForTheWin
|
|
||||||
properties:
|
|
||||||
...
|
|
||||||
```
|
|
||||||
|
|
||||||
## OpenAPI 3's "2xx" format for response codes
|
|
||||||
|
|
||||||
<!-- TODO: Remove this section after upgrading to OpenAPI v3 -->
|
|
||||||
|
|
||||||
In some cases, the schema will have HTTP response code definitions like
|
|
||||||
`2xx`, `3xx`, and `4xx`. These indicate that a response code within those
|
|
||||||
ranges (`2xx` = `200` to `299`) is valid for the schema.
|
|
||||||
|
|
||||||
## Custom `x-addedInMatrixVersion` key
|
## Custom `x-addedInMatrixVersion` key
|
||||||
|
|
||||||
|
|
|
@ -87,11 +87,11 @@ def check_response(filepath, request, code, response):
|
||||||
), e)
|
), e)
|
||||||
|
|
||||||
|
|
||||||
def check_swagger_file(filepath):
|
def check_openapi_file(filepath):
|
||||||
with open(filepath) as f:
|
with open(filepath) as f:
|
||||||
swagger = yaml.safe_load(f)
|
openapi = yaml.safe_load(f)
|
||||||
|
|
||||||
for path, path_api in swagger.get('paths', {}).items():
|
for path, path_api in openapi.get('paths', {}).items():
|
||||||
|
|
||||||
for method, request_api in path_api.items():
|
for method, request_api in path_api.items():
|
||||||
request = "%s %s" % (method.upper(), path)
|
request = "%s %s" % (method.upper(), path)
|
||||||
|
@ -169,7 +169,7 @@ if __name__ == '__main__':
|
||||||
# Get the directory that this script is residing in
|
# Get the directory that this script is residing in
|
||||||
script_directory = os.path.dirname(os.path.realpath(__file__))
|
script_directory = os.path.dirname(os.path.realpath(__file__))
|
||||||
|
|
||||||
# Resolve the directory containing the swagger sources,
|
# Resolve the directory containing the OpenAPI sources,
|
||||||
# relative to the script path
|
# relative to the script path
|
||||||
source_files_directory = os.path.realpath(os.path.join(script_directory, "../data"))
|
source_files_directory = os.path.realpath(os.path.join(script_directory, "../data"))
|
||||||
|
|
||||||
|
@ -182,6 +182,6 @@ if __name__ == '__main__':
|
||||||
path = os.path.join(root, filename)
|
path = os.path.join(root, filename)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
check_swagger_file(path)
|
check_openapi_file(path)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
raise ValueError("Error checking file %s" % (path,), e)
|
raise ValueError("Error checking file %s" % (path,), e)
|
|
@ -1,9 +1,8 @@
|
||||||
#!/usr/bin/env python3
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
# dump-swagger reads all of the swagger API docs used in spec generation and
|
# dump-openapi reads all of the OpenAPI docs used in spec generation and
|
||||||
# outputs a JSON file which merges them all, for use as input to a swagger UI
|
# outputs a JSON file which merges them all, for use as input to an OpenAPI
|
||||||
# viewer.
|
# viewer.
|
||||||
# See https://github.com/swagger-api/swagger-ui for details of swagger-ui.
|
|
||||||
|
|
||||||
# Copyright 2016 OpenMarket Ltd
|
# Copyright 2016 OpenMarket Ltd
|
||||||
#
|
#
|
||||||
|
@ -85,7 +84,7 @@ def edit_links(node, base_url):
|
||||||
edit_links(item, base_url)
|
edit_links(item, base_url)
|
||||||
|
|
||||||
parser = argparse.ArgumentParser(
|
parser = argparse.ArgumentParser(
|
||||||
"dump-swagger.py - assemble the Swagger specs into a single JSON file"
|
"dump-openapi.py - assemble the OpenAPI specs into a single JSON file"
|
||||||
)
|
)
|
||||||
parser.add_argument(
|
parser.add_argument(
|
||||||
"--base-url", "-b",
|
"--base-url", "-b",
|
||||||
|
@ -114,7 +113,7 @@ parser.add_argument(
|
||||||
)
|
)
|
||||||
parser.add_argument(
|
parser.add_argument(
|
||||||
"-o", "--output",
|
"-o", "--output",
|
||||||
default=os.path.join(scripts_dir, "swagger", "api-docs.json"),
|
default=os.path.join(scripts_dir, "openapi", "api-docs.json"),
|
||||||
help="File to write the output to. Default: %(default)s"
|
help="File to write the output to. Default: %(default)s"
|
||||||
)
|
)
|
||||||
args = parser.parse_args()
|
args = parser.parse_args()
|
|
@ -1,7 +1,7 @@
|
||||||
#!/usr/bin/env python
|
#!/usr/bin/env python
|
||||||
|
|
||||||
# Runs an HTTP server on localhost:8000 which will serve the generated swagger
|
# Runs an HTTP server on localhost:8000 which will serve the generated OpenAPI
|
||||||
# JSON so that it can be viewed in an online swagger UI.
|
# JSON so that it can be viewed in an online OpenAPI viewer.
|
||||||
|
|
||||||
# Copyright 2016 OpenMarket Ltd
|
# Copyright 2016 OpenMarket Ltd
|
||||||
#
|
#
|
||||||
|
@ -41,13 +41,13 @@ if __name__ == '__main__':
|
||||||
help='TCP port to listen on (default: %(default)s)',
|
help='TCP port to listen on (default: %(default)s)',
|
||||||
)
|
)
|
||||||
parser.add_argument(
|
parser.add_argument(
|
||||||
'swagger_dir', nargs='?',
|
'openapi_dir', nargs='?',
|
||||||
default=os.path.join(scripts_dir, 'swagger'),
|
default=os.path.join(scripts_dir, 'openapi'),
|
||||||
help='directory to serve (default: %(default)s)',
|
help='directory to serve (default: %(default)s)',
|
||||||
)
|
)
|
||||||
args = parser.parse_args()
|
args = parser.parse_args()
|
||||||
|
|
||||||
os.chdir(args.swagger_dir)
|
os.chdir(args.openapi_dir)
|
||||||
|
|
||||||
httpd = socketserver.TCPServer(("localhost", args.port),
|
httpd = socketserver.TCPServer(("localhost", args.port),
|
||||||
MyHTTPRequestHandler)
|
MyHTTPRequestHandler)
|
Loading…
Add table
Add a link
Reference in a new issue