@stencila/schema
Version:
Stencila schema and other specifications
133 lines (91 loc) • 4.63 kB
Markdown
## Authoring a type schema
For each type, there are two files:
- `<type>.schema.yaml` is the JSON Schema, written in YAML, for the type.
- `<type>.md` documentation for the type including examples and a description of design considerations for the schema
### Writing `<type>.schema.yaml` files
The schema for a type is defined, using JSON Schema, in a `<type>.schema.yaml` file. We use YAML, which is a superset of JSON, because it is more readable than JSON.
See the excellent [Understanding JSON Schema](https://json-schema.org/understanding-json-schema/) for guides on writing a JSON Schema. The following sections describe the most important, and custom, keywords in the schema in the order that they normally appear.
#### The `title` keyword
Each type schema MUST begin with the title of the type e.g.
```yaml
title: Organization
```
#### The `@id` keyword
This is a custom keyword used when generating the JSON-LD `@context`.
You MUST declare the `@id` keyword for each type using the format `<context>:<type>`. For example, `schema:Person`. Note that because this property name begins with the special character `@`, that it needs to be surrounded by quotes e.g.
```yaml
'@id': schema:Organization
```
Currently, the Stencila context allows you to refer to the following external contexts:
- `schema`: https://schema.org/
- `bioschemas`: http://bioschemas.org
- `codemeta`: https://doi.org/10.5063/schema/codemeta-2.0
For example, the type schema to represent a laboratory protocol might use the `@id` of the Bioschemas [`LabProtocol`](http://bioschemas.org/specifications/LabProtocol/).
```yaml
'@id': bioschemas:LabProtocol
```
Just as for types, properties of types can be linked to the other contexts using the `@id` keyword. For example,
```yaml
- properties:
address:
'@id': schema:address
type: string
```
#### The `$extends` keyword
This is a custom keyword which allows your type schema to inherit the `properties` and `required` keywords of a parent type schema. It should be a _relative_ file path e.g.
```yaml
$extends: ../Thing.schema.yaml
```
#### The `role` keyword
A RECOMMENDED custom keyword to indicate the role of the type schema:
- `base`: base types, not usually instantiated but required for other types e.g `Thing`
- `primary`: types that are usually the root of a tree generated from a file e.g. `Article`, `Datatable`, `Collection`
- `secondary`: types usually only referred to by primary types e.g. `Organization` is used for the `publisher` property on a `Article`
- `tertiary`: types usually only referred to by secondary types e.g. `ContactPoint` is used for the `contactPoints` property on an `Organization`
#### The `status` keyword
A RECOMMENDED custom keyword to indicate the development status of a type schema e.g.
- `experimental`: new types (i.e. not defined on schema.org or elsewhere) that are still under development
- `unstable`: types that are defined elsewhere (e.g. on http://bioschemas.org) but for which the schema is still being developed
- `stable`: types for which the schema definition can be considered stable
#### The `description` keyword
It is RECOMMENDED to add a description for all type schemas and properties. Descriptions can be Markdown formatted.
#### The `aliases` keyword
A custom keyword which allows you to define aliases for properties. For example,
```yaml
properties:
...
familyNames:
'@id': schema:familyName
aliases:
- familyName
- surname
- surnames
- lastName
- lastNames
```
#### The `parser` keyword
A custom keyword which allow you to define allowable shorthand strings for a property or types. The value of the keyword is the name of a parser to use. Parsers always take a string but differ in the type that they produce. Several parsers are available:
- `ssv`: space separated values to an array of strings
- `csv`: comma separated values to an array of strings
- `person`: personal name, email and url to a `Person`
You can implement and register additional parsers. See the parser for `Person` as an example of how to do that.
You can specify a parser for both types and properties. To specify a parser for a type, add the `parser` keyword at the top level e.g.
```yaml
title: Person
---
parser: person
```
You can specify a parser for a property using `anyOf`. For example, to allow `givenNames` to de provided as either a space separated values string or as an array of strings.
```yaml
title: Person
...
properties:
...
givenNames:
...
anyOf:
- parser: ssv
- type: array
items:
type: strings
```