Simplify uses of resolve-refs partial (#1773)

* Use the resolve-refs partial as soon as possible

Call it right after accessing the site.Data,
since it is recursing it will solve all references in the tree.
That way we don't need to wonder where to call it,
we trust the validators that the refs will be used in the right place.

* Enable strict $ref rule in OpenAPI validator

* Document use of $ref to compose examples

* Fix schema path in event-fields shortcode

Signed-off-by: Kévin Commaille <zecakeh@tedomum.fr>
This commit is contained in:
Kévin Commaille 2024-04-09 19:06:53 +02:00 committed by GitHub
parent 2ea8e0f514
commit 2678370f2c
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
10 changed files with 22 additions and 31 deletions

View file

@ -0,0 +1 @@
Simplify uses of `resolve-refs` partial.

View file

@ -5,15 +5,11 @@
* `api_data`: the OpenAPI 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.
We use this to resolve "$ref" values, since they are relative to the schema's
location.
*/}} */}}
{{ $api_data := index .api_data }} {{ $api_data := index .api_data }}
{{ $base_url := .base_url }} {{ $base_url := .base_url }}
{{ $path := .path }}
{{ range $path_name, $path_data := $api_data.paths }} {{ range $path_name, $path_data := $api_data.paths }}
@ -21,7 +17,7 @@
{{/* note that a `paths` entry can be a $ref */}} {{/* note that a `paths` entry can be a $ref */}}
{{ $params := dict "endpoint" $endpoint "path" $path }} {{ $params := dict "endpoint" $endpoint }}
{{ with $path_data.get }} {{ with $path_data.get }}

View file

@ -5,7 +5,6 @@
* `method`: the method, e.g. GET, PUT * `method`: the method, e.g. GET, PUT
* `endpoint`: the endpoint * `endpoint`: the endpoint
* `operation_data`: the OpenAPI 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"
This template renders the operation as a `<section>` containing: This template renders the operation as a `<section>` containing:
@ -21,7 +20,6 @@
{{ $method := .method }} {{ $method := .method }}
{{ $endpoint := .endpoint }} {{ $endpoint := .endpoint }}
{{ $operation_data := .operation_data }} {{ $operation_data := .operation_data }}
{{ $path := .path }}
{{ $anchor := anchorize $endpoint }} {{ $anchor := anchorize $endpoint }}
<section class="rendered-data http-api {{ $method }}"> <section class="rendered-data http-api {{ $method }}">
@ -80,9 +78,9 @@
</table> </table>
<hr/> <hr/>
{{ partial "openapi/render-request" (dict "parameters" $operation_data.parameters "request_body" $operation_data.requestBody "path" $path "anchor_base" $anchor ) }} {{ partial "openapi/render-request" (dict "parameters" $operation_data.parameters "request_body" $operation_data.requestBody "anchor_base" $anchor ) }}
<hr/> <hr/>
{{ partial "openapi/render-responses" (dict "responses" $operation_data.responses "path" $path "anchor_base" $anchor ) }} {{ partial "openapi/render-responses" (dict "responses" $operation_data.responses "anchor_base" $anchor ) }}
</details> </details>

View file

@ -5,7 +5,6 @@
* `parameters`: OpenAPI 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
* `path`: the path where this definition was found, to enable us to resolve "$ref"
This template renders a single table containing parameters of the given type. This template renders a single table containing parameters of the given type.
@ -14,9 +13,7 @@
{{ $parameters := .parameters }} {{ $parameters := .parameters }}
{{ $type := .type }} {{ $type := .type }}
{{ $caption := .caption }} {{ $caption := .caption }}
{{ $path := .path }}
{{ $parameters = partial "json-schema/resolve-refs" (dict "schema" $parameters "path" $path) }}
{{ $parameters_of_type := where $parameters "in" $type }} {{ $parameters_of_type := where $parameters "in" $type }}
{{ with $parameters_of_type }} {{ with $parameters_of_type }}

View file

@ -4,7 +4,6 @@
* `parameters`: OpenAPI data specifying the parameters * `parameters`: OpenAPI data specifying the parameters
* `request_body`: OpenAPI 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"
* `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
This template renders: This template renders:
@ -16,7 +15,6 @@
{{ $parameters := .parameters }} {{ $parameters := .parameters }}
{{ $request_body := .request_body }} {{ $request_body := .request_body }}
{{ $path := .path }}
{{ $anchor_base := .anchor_base }} {{ $anchor_base := .anchor_base }}
<h2>Request</h2> <h2>Request</h2>
@ -26,9 +24,9 @@
{{ if $parameters }} {{ if $parameters }}
<h3>Request parameters</h3> <h3>Request parameters</h3>
{{ partial "openapi/render-parameters" (dict "parameters" $parameters "type" "header" "caption" "header parameters" "path" .path) }} {{ partial "openapi/render-parameters" (dict "parameters" $parameters "type" "header" "caption" "header parameters") }}
{{ partial "openapi/render-parameters" (dict "parameters" $parameters "type" "path" "caption" "path parameters" "path" .path) }} {{ partial "openapi/render-parameters" (dict "parameters" $parameters "type" "path" "caption" "path parameters") }}
{{ partial "openapi/render-parameters" (dict "parameters" $parameters "type" "query" "caption" "query parameters" "path" .path) }} {{ partial "openapi/render-parameters" (dict "parameters" $parameters "type" "query" "caption" "query parameters") }}
{{ end }} {{ end }}
@ -42,8 +40,7 @@
{{/* {{/*
Display the JSON schemas Display the JSON schemas
*/}} */}}
{{ $schema := partial "json-schema/resolve-refs" (dict "schema" $json_body.schema "path" $path) }} {{ $schema := partial "json-schema/resolve-allof" $json_body.schema }}
{{ $schema := partial "json-schema/resolve-allof" $schema }}
{{ $additional_types := partial "json-schema/resolve-additional-types" (dict "schema" $schema "anchor_base" $anchor_base) }} {{ $additional_types := partial "json-schema/resolve-additional-types" (dict "schema" $schema "anchor_base" $anchor_base) }}
{{ range $additional_types }} {{ range $additional_types }}
@ -70,8 +67,7 @@
{{ $example := dict }} {{ $example := dict }}
{{ if $body.schema }} {{ if $body.schema }}
{{ $schema := partial "json-schema/resolve-refs" (dict "schema" $body.schema "path" $path) }} {{ $schema := partial "json-schema/resolve-allof" $body.schema }}
{{ $schema := partial "json-schema/resolve-allof" $schema }}
{{ $example = partial "json-schema/resolve-example" $schema }} {{ $example = partial "json-schema/resolve-example" $schema }}
{{ end }} {{ end }}

View file

@ -3,7 +3,6 @@
Render the response part of a single HTTP API operation, given: Render the response part of a single HTTP API operation, given:
* `responses`: OpenAPI data specifying the responses * `responses`: OpenAPI data specifying the responses
* `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
This template renders: This template renders:
@ -15,7 +14,6 @@
*/}} */}}
{{ $responses := .responses }} {{ $responses := .responses }}
{{ $path := .path }}
{{ $anchor_base := .anchor_base }} {{ $anchor_base := .anchor_base }}
<h2>Responses</h2> <h2>Responses</h2>
@ -26,8 +24,6 @@
<th class="col-status-description">Description</th> <th class="col-status-description">Description</th>
</thead> </thead>
{{ $responses = partial "json-schema/resolve-refs" (dict "schema" $responses "path" $path) }}
{{ range $code, $response := $responses }} {{ range $code, $response := $responses }}
<tr> <tr>
@ -92,8 +88,7 @@
{{ if or (eq $schema.type "object") (eq $schema.type "array") }} {{ if or (eq $schema.type "object") (eq $schema.type "array") }}
{{ $example := partial "json-schema/resolve-example" $schema }} {{ $example := partial "json-schema/resolve-example" $schema }}
{{ if $json_body.examples }} {{ if $json_body.examples }}
{{ $example = partial "json-schema/resolve-refs" (dict "schema" $json_body.examples "path" $path) }} {{ $example = $json_body.examples.response.value }}
{{ $example = $example.response.value }}
{{ end }} {{ end }}
{{ $example_json := jsonify (dict "indent" " ") $example }} {{ $example_json := jsonify (dict "indent" " ") $example }}

View file

@ -13,7 +13,7 @@
*/}} */}}
{{ $event := index .Site.Data "event-schemas" "schema" "core-event-schema" .Params.event_type }} {{ $event := index .Site.Data "event-schemas" "schema" "core-event-schema" .Params.event_type }}
{{ $path := "event-schemas/schema/core-event-schema" }} {{ $path := delimit (slice "event-schemas/schema/core-event-schema" .Params.event_type) "/" }}
{{ $event = partial "json-schema/resolve-refs" (dict "schema" $event "path" $path) }} {{ $event = partial "json-schema/resolve-refs" (dict "schema" $event "path" $path) }}
{{ $event := partial "json-schema/resolve-allof" $event }} {{ $event := partial "json-schema/resolve-allof" $event }}

View file

@ -23,4 +23,6 @@
{{ $base_url := (index $api_data.servers 0).variables.basePath.default }} {{ $base_url := (index $api_data.servers 0).variables.basePath.default }}
{{ $path := delimit (slice "api" $spec $api) "/" }} {{ $path := delimit (slice "api" $spec $api) "/" }}
{{ partial "openapi/render-api" (dict "api_data" $api_data "base_url" $base_url "path" $path) }} {{ $api_data = partial "json-schema/resolve-refs" (dict "schema" $api_data "path" $path) }}
{{ partial "openapi/render-api" (dict "api_data" $api_data "base_url" $base_url) }}

View file

@ -26,3 +26,8 @@ property, etc).
A variation of the above: indicates changes to the associated parameter in A variation of the above: indicates changes to the associated parameter in
particular Matrix specification versions. particular Matrix specification versions.
## Use of `$ref` inside examples
Although the OpenAPI/JSON Schema specs only allow to use `$ref` to reference a
whole example, we use it to compose examples from other examples.

View file

@ -1,10 +1,11 @@
# See https://redocly.com/docs/cli/configuration/ for more information. # See https://redocly.com/docs/cli/configuration/ for more information.
extends: extends:
- minimal - recommended-strict
rules: rules:
info-license: off info-license: off
security-defined: off security-defined: off
operation-4xx-response: off operation-4xx-response: off
no-invalid-media-type-examples: off no-invalid-media-type-examples: off
no-path-trailing-slash: off no-path-trailing-slash: off
operation-2xx-response: off operation-2xx-response: off
spec-strict-refs: error