JSON domain¶
This theme defines a json
domain that supports documenting JSON schemas.
Prerequisite¶
This extension requires the PyYAML
package; you must either add it as a dependency directly, or add json
extra
feature of this package as a dependency:
pip install sphinx-immaterial[json]
Configuration¶
To use this domain, add sphinx_immaterial.apidoc.json.domain
to the
list of extensions
in conf.py
and set the
json_schemas
configuration option to a list of glob patterns
specifying the JSON schema definition files.
extensions = [
# other extensions...
"sphinx_immaterial.apidoc.json.domain",
]
json_schemas = [
"**/*_schema.yml",
]
-
json_schemas : list[str] =
[]
¶ List of
glob
patterns matching JSON schema definition files relative to the documentation source directory.Both JSON and YAML format are supported.
The top-level schema in each file must specify an
$id
.
-
json_schema_validate : bool =
False
¶ Indicates whether to validate the JSON schemas specified by
json_schemas
.Requires that the jsonschema package is installed; you can either add it as a dependency directly, or depend on the
jsonschema_validation
extra feature of this package:pip install sphinx-immaterial[json,jsonschema_validation]
-
json_schema_rst_prolog : str =
''
¶ A string of rST that will be prepended to the
title
anddescription
fields of a schema before parsing them as rST.This may be used to set the rST directive default-role,
highlight
language, ordefault-literal-role
.Note
The prior default role, default literal role, and default highlight langauge are automatically restored after processing the
json_schema_rst_epilog
. Therefore, it is not necessary to manually add anything tojson_schema_rst_epilog
to restore the prior roles or highlight language.rst_prolog = """ .. role:: json(code) :language: json :class: highlight """ json_schema_rst_prolog = """ .. default-role:: json:schema .. default-literal-role:: json .. highlight:: json """
-
json_schema_rst_epilog : str =
''
¶ A string of rST that will be appended to the
title
anddescription
fields of a schema before parsing them as rST.This option is supported for symmetry with
json_schema_rst_prolog
, but in most cases is not needed because any changes to the default role, default literal role, and default highlight language due tojson_schema_rst_prolog
are undone automatically.
All of the Object description options also apply to this domain. Any
top-level schemas have an object type of json:schema
and any members have an
object type of json:subschema
.
Usage¶
- .. json:schema::¶
Generates documentation for a single JSON schema specified by its
$id
.Note
It is not possible to refer to a schema without an
$id
.The
title
anddescription
properties are parsed as reStructedText (in the context specified byjson_schema_rst_prolog
andjson_schema_rst_epilog
).If
generate_synopses
is not disabled, the synopsis is generated from thetitle
property. If there is notitle
property, no synopsis is generated.- :noindex:¶
Flag option to exclude the schema from search results and the table of contents. Also disables cross linking.
This option implies
json:schema:exclude_from_toc
.
- :title:¶
Specifies a title to use for the schema instead of the
$id
.
- :toc_title:¶
Specifies the title to use in the table of contents instead of the
json:schema:title
or$id
.Only has an effect if
include_in_toc
isTrue
.
- :exclude_from_toc:¶
Excludes the schema from the table of contents.
This overrides
include_in_toc
.
- :json:schema:¶
Cross-links to a JSON schema defined using
json:schema
, or one of its properties.A complete schema is specified by its ``$id``: :json:schema:`Pet`. An individual member of a schema is specified using dot notation: :json:schema:`Pet.name`.
Similar to the Python domain, the target may start with
~
to shorten the link text to just the last component::json:schema:`~Pet.name`
If used within the
title
ordescription
of ajson:schema
, cross-references are resolved relative to the current schema. For example, within the “description” for theMySchema.member
schema::json:schema:`.other_member`
will look first for
MySchema.member.other_member
, thenMySchema.other_member
, thenother_member
. This is the same behavior as for the Python domain. If the initial.
is removed, then search order is reversed. For example::json:schema:`other_member`
will look first forother_member
, thenMySchema.other_member
, thenMySchema.member.other_member
.
Examples¶
Inheritance example¶
$schema: http://json-schema.org/draft-07/schema#
$id: Pet
title: "Represents a generic pet."
type: object
properties:
type:
type: string
title: Type of pet.
name:
type: string
title: Name of the pet.
age:
type: number
title: Age of the pet in years.
minimum: 0
required:
- type
- name
definitions:
dog:
$id: Dog
title: "Represents a dog."
allOf:
- $ref: Pet
- type: object
properties:
type:
const: "dog"
bark_volume:
type: number
title: "Bark volume in dB."
favorite_walk:
type: string
title: "Favorite place to walk."
cat:
$id: Cat
title: "Represents a cat."
allOf:
- $ref: Pet
- type: object
properties:
type:
const: "cat"
meow_volume:
type: number
title: "Meow volume in dB."
favorite_scratching_post:
type: string
title: "Favorite place to scratch."
examples:
- {"type": "cat", "name": "Tom", "age": 10, "meow_volume": 45}
.. json:schema:: Pet
.. json:schema:: Dog
.. json:schema:: Cat
- json Pet : object¶
Represents a generic pet.
- json Dog : object¶
Represents a dog.
Other example¶
$schema: http://json-schema.org/draft-07/schema#
$id: IndexTransform
description: |
Index transforms may be serialized to/from JSON using
the following schema.
The input domain is specified by `.input_rank`,
`.input_inclusive_min`, `.input_exclusive_max`,
`.input_inclusive_max`, `.input_shape`, and
`.input_labels`, while the output index maps are specified by
`.output`.
If neither `.input_inclusive_min` nor `.input_shape`
is specified, all dimensions receive an implicit lower bound of
:math:`-\infty`. If `.input_shape` is specified but
`.input_inclusive_min` is not specified, all dimensions receive an
explicit lower bound of 0.
At most one of `.input_exclusive_max`,
`.input_inclusive_max`, and `.input_shape` may be
specified. If none are specified, all dimensions receive an implicit upper
bound of :math:`+\infty`.
type: object
properties:
input_rank:
type: integer
minimum: 0
maximum: 32
title: Number of input dimensions.
description: |
The input rank must be specified either directly, or implicitly by the
number of dimensions specified for `.input_inclusive_min`,
`.input_inclusive_max`, `.input_exclusive_max`,
`.input_shape`, or `.input_labels`.
input_inclusive_min:
type: array
items:
oneOf:
- type: integer
- type: array
items:
- type: integer
title: |
Inclusive lower bounds of the input domain.
description: |
Length must equal the `.input_rank`. Bounds specified as :samp:`{n}`
indicate normal, explicit bounds, while bounds specified as :samp:`[{n}]`
indicate implicit bounds. For example, :json:`[1, [2]]` specifies an
explicit bound of :math:`1 \leq x` for the first dimension and an implicit
bound of :math:`2 \leq x` for the second dimension.
input_exclusive_max:
type: array
items:
oneOf:
- type: integer
- type: array
items:
- type: integer
title: |
Exclusive upper bounds of the input domain.
description: |
Length must equal the `.input_rank`. As for `.input_inclusive_min`,
bounds specified as :samp:`{n}` indicate normal, explicit bounds, while
bounds specified as :samp:`[{n}]` indicate implicit bounds. For example,
:json:`[5, [7]]` specifies an explicit bound of :math:`x < 5` for the
first dimension and an implicit bound of :math:`x < 7` for the second
dimension.
input_inclusive_max:
type: array
items:
oneOf:
- type: integer
- type: array
items:
- type: integer
title: |
Inclusive upper bounds of the input domain.
description: |
Length must equal the `.input_rank`. As for `.input_inclusive_min`,
bounds specified as :samp:`{n}` indicate normal, explicit bounds, while
bounds specified as :samp:`[{n}]` indicate implicit bounds. For example,
:json:`[5, [7]]` specifies an explicit bound of :math:`x \leq 5` for the
first dimension and an implicit bound of :math:`x \leq 7` for the second
dimension.
input_shape:
type: array
items:
oneOf:
- type: integer
- type: array
items:
- type: integer
title: |
Extent of each dimension of the input domain.
description: |
Length must equal the `.input_rank`. As for `.input_inclusive_min`,
bounds specified as :samp:`{n}` indicate normal, explicit bounds, while
bounds specified as :samp:`[{n}]` indicate implicit bounds. For example,
assuming an `.input_inclusive_min` of :json:`[1, 2]`, an `.input_shape` of
:json:`[5, [7]]` specifies an explicit bound of :math:`x < 6` for the
first dimension and an implicit bound of :math:`x < 9` for the second
dimension.
input_labels:
type: array
items:
type: string
title: |
Dimension labels for each input domain dimension.
description: |
Length must equal the `.input_rank`. An empty string
indicates an unlabeled dimension. Non-empty strings must not occur more
than once. By default, all dimensions are unlabeled.
output:
type: array
title: |
Specifies the output index map for each output dimension.
description: |
If not specified, defaults to an identity transform over the input domain.
Otherwise, the length determines the output rank of the transform.
items:
$ref: OutputIndexMap
definitions:
output-index-map:
$id: OutputIndexMap
title: Specifies a transform from an input space to a single output index.
description: |
Logically, an output index map is a function that maps ``n``-dimensional
input index vectors to a single output index, using one of the supported
output index methods. This is used to represent the
:json:schema:`IndexTransform.output` mapping for each output dimension of
an `IndexTransform`.
type: object
properties:
offset:
type: integer
title: |
Specifies an offset for this output dimension. If neither
`.input_dimension` nor `.index_array` is
specified, this specifies the **constant** value to which this output
dimension maps.
stride:
type: integer
title: |
Multiplier for the input index specified by
`.input_dimension` or the index array value specified by
`.index_array`.
description: |
Only valid to specify in conjunction with
`.input_dimension` or `.index_array`.
input_dimension:
type: integer
minimum: 0
title: |
If present, indicates that this output dimension uses a **single
input dimension** map with the specified input dimension. Must not
be specified in conjunction with `.index_array`.
index_array:
oneOf:
- type: array
- type: integer
title: |
If present, indicates that this output dimension uses an **index
array** map, with the index array specified as a nested list of rank
equal to the `~IndexTransform.input_rank`.
description: |
If the `~IndexTransform.input_rank` is 0, must be a numeric value.
index_array_bounds:
$ref: IndexInterval
description: |
If present, specifies constraints on the values within
`.index_array` (which must also be specified). If
`.index_array` contains an out-of-bounds index, an error
may not be returned immediately but will be returned if the
corresponding position within the domain is accessed. If the
indices in `.index_array` have already been validated,
this need not be specified. This allows transforms containing
out-of-bounds index array indices to correctly round trip through
JSON, but normally need not be specified manually.
default: ["-inf", "+inf"]
examples:
- [5, 100]
- ["-inf", 10]
- [-20, "+inf"]
index-interval:
$id: IndexInterval
title: Specifies a closed interval of integer index values.
type: array
items:
- oneOf:
- type: integer
- const: "-inf"
- oneOf:
- type: integer
- const: "+inf"
.. json:schema:: IndexTransform
.. json:schema:: OutputIndexMap
.. json:schema:: IndexInterval
- json IndexTransform : object¶
Index transforms may be serialized to/from JSON using the following schema.
The input domain is specified by
input_rank
,input_inclusive_min
,input_exclusive_max
,input_inclusive_max
,input_shape
, andinput_labels
, while the output index maps are specified byoutput
.If neither
input_inclusive_min
norinput_shape
is specified, all dimensions receive an implicit lower bound of \(-\infty\). Ifinput_shape
is specified butinput_inclusive_min
is not specified, all dimensions receive an explicit lower bound of 0.At most one of
input_exclusive_max
,input_inclusive_max
, andinput_shape
may be specified. If none are specified, all dimensions receive an implicit upper bound of \(+\infty\).- Optional members:¶
-
input_rank : integer[
0
,32
]¶ Number of input dimensions.
The input rank must be specified either directly, or implicitly by the number of dimensions specified for
input_inclusive_min
,input_inclusive_max
,input_exclusive_max
,input_shape
, orinput_labels
.
- input_inclusive_min : array of integer | [integer]¶
Inclusive lower bounds of the input domain.
Length must equal the
input_rank
. Bounds specified asn
indicate normal, explicit bounds, while bounds specified as[n]
indicate implicit bounds. For example,[1, [2]]
specifies an explicit bound of \(1 \leq x\) for the first dimension and an implicit bound of \(2 \leq x\) for the second dimension.
- input_exclusive_max : array of integer | [integer]¶
Exclusive upper bounds of the input domain.
Length must equal the
input_rank
. As forinput_inclusive_min
, bounds specified asn
indicate normal, explicit bounds, while bounds specified as[n]
indicate implicit bounds. For example,[5, [7]]
specifies an explicit bound of \(x < 5\) for the first dimension and an implicit bound of \(x < 7\) for the second dimension.
- input_inclusive_max : array of integer | [integer]¶
Inclusive upper bounds of the input domain.
Length must equal the
input_rank
. As forinput_inclusive_min
, bounds specified asn
indicate normal, explicit bounds, while bounds specified as[n]
indicate implicit bounds. For example,[5, [7]]
specifies an explicit bound of \(x \leq 5\) for the first dimension and an implicit bound of \(x \leq 7\) for the second dimension.
- input_shape : array of integer | [integer]¶
Extent of each dimension of the input domain.
Length must equal the
input_rank
. As forinput_inclusive_min
, bounds specified asn
indicate normal, explicit bounds, while bounds specified as[n]
indicate implicit bounds. For example, assuming aninput_inclusive_min
of[1, 2]
, aninput_shape
of[5, [7]]
specifies an explicit bound of \(x < 6\) for the first dimension and an implicit bound of \(x < 9\) for the second dimension.
- input_labels : array of string¶
Dimension labels for each input domain dimension.
Length must equal the
input_rank
. An empty string indicates an unlabeled dimension. Non-empty strings must not occur more than once. By default, all dimensions are unlabeled.
- output : array of OutputIndexMap¶
Specifies the output index map for each output dimension.
If not specified, defaults to an identity transform over the input domain. Otherwise, the length determines the output rank of the transform.
-
input_rank : integer[
- json OutputIndexMap : object¶
Specifies a transform from an input space to a single output index.
Logically, an output index map is a function that maps
n
-dimensional input index vectors to a single output index, using one of the supported output index methods. This is used to represent theIndexTransform.output
mapping for each output dimension of anIndexTransform
.- Optional members:¶
- offset : integer¶
Specifies an offset for this output dimension. If neither
input_dimension
norindex_array
is specified, this specifies the constant value to which this output dimension maps.
- stride : integer¶
Multiplier for the input index specified by
input_dimension
or the index array value specified byindex_array
.Only valid to specify in conjunction with
input_dimension
orindex_array
.
-
input_dimension : integer[
0
, +∞)¶ If present, indicates that this output dimension uses a single input dimension map with the specified input dimension. Must not be specified in conjunction with
index_array
.
- index_array : array | integer¶
If present, indicates that this output dimension uses an index array map, with the index array specified as a nested list of rank equal to the
input_rank
.If the
input_rank
is 0, must be a numeric value.
-
index_array_bounds : IndexInterval =
["-inf", "+inf"]
¶ If present, specifies constraints on the values within
index_array
(which must also be specified). Ifindex_array
contains an out-of-bounds index, an error may not be returned immediately but will be returned if the corresponding position within the domain is accessed. If the indices inindex_array
have already been validated, this need not be specified. This allows transforms containing out-of-bounds index array indices to correctly round trip through JSON, but normally need not be specified manually.Example
[5, 100]
Example
["-inf", 10]
Example
[-20, "+inf"]
-
json IndexInterval : [integer |
"-inf"
, integer |"+inf"
]¶ Specifies a closed interval of integer index values.